Introduction

Prioritisation can largely be broken into two steps – geographic prioritisation and beneficiary selection.

This document examines data from the FAO-WFP Shocks, Agricultural Livelihoods and Food Security Survey, the Armed Conflict Location and Event Dataset (ACLED) and the Myanmar Information Management Unit (MIMU).

The first section deals with the development of core beneficiary selection criteria using the FAO-WFP survey data. The second section makes use of ACLED data for Myanmar to develop a conflict score for township prioritisation. Township and beneficiary selection criteria are linked by a decision tree. The third section presents flood risks by township – these are only probabilities and serve as references for prepositioning and disaster risk reduction. They not included in the overall prioritisation process, though this might change if disasters occur.


References for this report




1. Beneficiary Selection using FAO-WFP survey data

A total of 2708 households were interviewed in the FAO-WFP Shocks, Agricultural Livelihoods and Food Security Survey in Ayeyarwady, Kachin, Kayah, Kayin, Mon, Rakhine, Shan and Yangon to monitor food security and livelihoods of persons in Myanmar. Some of the most key data collected were on the various food security indices – the Food Consumption Score (FCS), the Food Insecurity Experience Scale (FIES) and the Livelihood Coping Strategies Index (CSI). Additionally, a composite of the three indices, the Food Security Score has also been calculated. Information was also collected on basic household demographics as well on income sources. Much more detail can be gleaned from the report itself – this document focuses only on the aspects of the survey which can be used for prioritisation.



1.1 An overview of the food security indicators

The plot below ranks variables in order of their ability to predict the various food insecurity composite indices. Only environmental or demographic variables were taken into account as it would be redundant to predict food security indices using the components of said indices. Only responses that occurred more than 200 times (out of 2,708) in the survey were considered.

Variables that are more red are most likely to result in high food insecurity scores (that is, higher food insecurity) and variables that are more blue are more likely to result in lower food insecurity scores. The dotted red line down the middle at \(x=0\) splits variables into whether the predict higher food insecurity (positive numbers) or lower food insecurity (negative numbers).

For all these plots, the scores of the food security indices have all been scaled between 0 and 1, with higher scores indicating greater food insecurity.



The plots above ranks variables in order of their ability to predict the various food security composite indices. Variables that are more red are more likely to result in high food insecurity scores and variables that are more blue are more likely to results in lower food insecurity scores.

The variables that are the most important in predicting high food security scores are a household’s exposure to conflict, whether or not they lost employment or work opportunities, whether or not they were engaged in casual non-agricultural labour and whether or not they reported no income in the three months prior to the survey.

These variables can be thought of as a preliminary list of beneficiary selection criteria for food security and livelihoods programming. This list is, of course, non-exhaustive as it only includes variables that were included in the FAO-WFP survey.

The variables that were the best predictors of low food insecurity were whether or not the head of household had completed higher education and whether or not the main income source of the household was stable non-agricultural employment.



1.2 Setting a threshold for prioritisation

An important step is narrowing down the population to a priority group – Food Security Cluster partners do not have the resources to target all persons.

A household was considered to be a priority for intervention when they were above the 75th percentile in at least two out of the three food security indices (food consumption score, coping strategies index and food insecurity experience scale)

Approximately 34% of the total population falls into this priority group. The plot below shows the food security sub-indicators that are the most important in determining whether a household falls into the priority group or not.

The plots below shows the differences between the average values of food security index components based on whether they are priority households or not. Variables in blue correspond to Coping Strategies Index indicators, those in red to the Food Insecurity Experience Scale.

Those in green correspond to the Food Consumption Score – for these indicators, they have been rescaled so that a value of 1 shows that a household has not consumed that food group at all in the previous 7 days and a value of 0 shows that they have consumed that food group every day for the past 7 days.



Whilst both groups tend to consume low amounts of dairy, pulses, sugar and fruits, these trends are much more pronounced in the priority group. Additionally, households in the priority group are more than twice as likely to have poor protein consumption, be worried about not having enough food and eat less due to a lack of resources.

Households in the priority group were also more than four times as likely to have reduced healthcare expenditures, have sold productive assets and be unable to eat healthy and nutritious foods and eat only a few kinds of foods. They are also more than five times as likely to skipped meals or gone hungry.



1.3 Decision tree

However large the differences are between the food security statuses of those in the priority group and those outside of it, many of these indicators are not easily observable. It would be extremely challenging to conduct a large-scale comprehensive food security survey prior to beneficiary selection.

This necessitates the creation of simple tool to aid in prioritisation. A simple tree has been developed, considering only the variables in the FAO-WFP survey that are easily observable. The tree below takes into account only three variables – whether or not a household is in a rural area, whether or not they have experienced violence, insecurity or conflict in the past three months and whether or not they have lost work or employment opportunities in the past three months.

Within each blue square, the figure in bold show the percentage of each group that are priority households and the figures in italics show the percentage of the overall population in each node.


Decision tree

The percentage of priority households in rural areas is much higher than in urban ones (37.6% vs 26.1%). For rural areas, the indicator that best distinguishes priority households is whether or they have directly experienced violence, insecurity or conflict in the past three months. The factor that best distinguishes priority households in urban areas is whether or not they have lost work or employment opportunities in the past three months.

The performance of the decision tree is not exactly spectacular – if a partner wanted to target an entire community, the threshold for blanket coverage would be around 75% or 80% being in the priority group. But the decision tree is very simple and understandable (the last section on technical notes explains why a linear regression model was not employed here). Additional beneficiary selection criteria will be necessary, but this decision tree does at least give some direction for geographic prioritisation, which is discussed in the next section.

As a note, these findings are consistent with IFPRI’s survey on household welfare where rural households were found to be more asset-poor and less resilient than urban ones. However, much more work remains to be done on triangulating the FAO-WFP survey with the IFPRI one, which was much more comprehensive in scope and scale.



1.4 Exceptions for targeting agricultural households

64.7% of the total population is in the tree node [6] (the nodes are all numbered in the decision tree above) – within this group are households who reside in rural areas but have not been affected by violence, conflict or insecurity. Given that this is a significant chunk of the population where, with reference to the plot below, 78% of the population is involved in agriculture, an exception can be made in this one instance, to support partners who want to target agricultural households who have not been affected by the conflict.

It must still be mentioned that aid flow first to the households in node [7], where the proportion of households in the priority group is highest. Only after the needs of this population are met should households in node [6] be targeted.



The tree below carries on from node [6] of the main decision tree in the section above. Within this group of rural households not affected by conflict (64.7% of the total population), identifying households who have lost access to markets due to conflict, infrastructure damage or other access issues and households who have been affected by natural hazards (the most common of which is flooding) improves the chances of targeting households in the priority group to slightly above 50%.

Any further conditions applied on the tree only result in extremely marginal gains.


Decision tree – from tree node [6]


It is perhaps best to target priority households in these areas by establishing clear beneficiary selection criteria. The plot below shows the best predictors of food insecurity within the households in node [6].

The variables within the FAO-WFP survey most of use to partners targeting priority households in node [6] are whether or not a household has improved sanitation and the educational attainment of the head of the household. The most important shocks for this group were natural hazards and the loss of work or employment opportunities. These variables constitute several core criteria fo beneficiary selection for rural households that have not been affected by conflict.




1.5 Impact of conflict on food security

Conflict has a real, though sometimes limited impact on food security. Though the FAO-WFP survey was not developed with measuring the impact of conflict in mind, it is nevertheless possible to control for some factors and examine the impact of conflict on several groups.

The plot below shows the impact on the overall food insecurity scores based on whether a household has been impacted by conflict or not. We have selected the two largest groups within the rural and urban context (farmers and workers employed in stable, non-agricultural employment) and have split these populations by education level.



The food insecurity scores of all groups except one are higher when a household has experienced conflict. This by no means constitutes a scientific proof (another survey would have to be conducted), but it is possible to state with some confidence that exposure to conflict has a negative impact on food security. The small sample size likely results in widely diverging values in some cases; additionally the purpose of the FAO-WFP survey was not to understand conflict dynamics.

The plot below is further examination of the impact of conflict on food security. The estimates in the plot below show the impact of exposure to conflict on the various food security indices. The food security indices used were re-scaled between 0 and 1, with higher scores indicating greater food insecurity.

Notably, the effect of conflict was most pronounced in the Food Insecurity Experience Scores of rural households – exposure to conflict in these households was linked with a 0.12 increase in score, which is substantial. All the effects were statistically significant with the exception of conflict on Food Consumption Scores in urban contexts (that point is marked by a triangle in the plot below to denote this).



In the next section, conflict scores will be used to prioritise between townships.




2. Distribution of conflict events in Myanmar

Approximately 6% of all the households surveyed by FAO-WFP were directly affected by conflict, violence and insecurity. This discounts households that have been affected by the secondary impacts of conflict, such as loss of access to markets and increased food prices. Whilst there is no set threshold whereby one can state that everyone in a given area has been affected by conflict, it is possible to determine where the conflict has been the most severe.

Similar to how the basic criteria beneficiary selection at the household level was described in the section above, this section will focus on how to prioritise amongst the various geographic areas in Myanmar. For a more comprehensive review of conflict in Myanmar, please refer to the Food Security Cluster’s report Understanding Conflict Dynamics in Myanmar through Conflict and Incident Data: A Food Security Perspective.



2.1 Conflict events and fatalities by state/region


Sagaing saw the highest number of conflict events as well as conflict as well as conflict-related fatalities in 2012. It experienced more than three times as many conflict-related fatalities than the next-highest state/region – Magway. This is a significant shift in the pattern of conflict in Myanmar, which has traditionally revolved around Kachin, Rakhine and Shan.

Kayah, Chin and Sagaing had the highest number of conflict fatalities per capita in 2021.




2.2 Conflict score by township

As can be seem from the barplots in the previous section, the distribution of conflict events and fatalities is not even, being skewed to a few states/regions. This is also evident at township level. In the scatterplot below, the averages of the number of conflict events and the number of fatalities at the township level have been marked by the dotted red lines, dividing the plot into four quadrants.

A requisite for any prioritisation score or index develop should be target, first and foremost, the townships in the upper right quadrant of the plot, which have the heaviest concentrations of conflict events and fatalities. These areas are where, as we have established in the section on beneficiary selection, where the highest concentrations of households in the priority group will be found. For reference, 58 townships have both above-average numbers of conflict events and fatalities (upper-right quadrant) and 196 townships have both below-average numbers of conflict events and fatalities (bottom-left quadrant).



At its most basic, the conflict score is just the average of battles, explosions, remote violence, violence against civilians, strategic developments, non-peaceful protests and riots and conflict-related fatalities. More details can be found in the FSC;s report Understanding Conflict Dynamics in Myanmar through Conflict and Incident Data: A Food Security Perspective. This score will be now be used as a shorthand for conflict incidence in Myanmar.

It is additionally recognised that different types of townships necessitate different programming options. And, as established in the first section, rural and urban areas have widely differing numbers of households in the priority group. Therefore, townships hace also split into four simple groups (A1, A2, B1 and B2) based on their conflict score and population density.

This grouping separates all 330 townships along two criteria – high (A) or low (B) conflict score and high (1) or low (2) population density. Groups A1 and A2 have above average conflict scores. These 107 townships should be prioritised for humanitarian interventions. Recalling the scatterplot above, the colours have now been updated to reflect the prioritisation group. From the plot below that whilst group A1 have populations that are easier to access (having higher population density), the incidence of conflict is higher overall in group A2, with the numbers of conflict-related fatalities being much higher. This quick-and-dirty prioritisation has managed to exclude almost all the townships in bottom-left quadrant (least conflict-affected) from groups A1 and A2.



Groups A1 and A2 can be distinguished by their population density, with the average population density in group A1 being more than 100 times higher than in group A2. The average PIN per township is slightly higher in group A1 than in group A2. The scatterplot below shows townships by the number of people in need (x-axis) and the population density (y-axis), with the colours reflecting which group each belongs to:



The table below provides some summary statistics for each of the four groups. Included are the PIN and population targeted within the townships in each group, the average conflict score (higher conflict scores indicate a higher incidence of conflict), the average population density and the number of townships within each group:


Summary statistics by township group
group PIN target conflict_score ppl_per_km2 townships
A1 1,505,106 1,303,822 0.128 15,470 22
A2 3,875,620 702,741 0.151 113 82
B1 497,165 440,226 0.026 16,483 19
B2 7,344,579 1,653,213 0.017 116 207
Note: Groups A1 and A2 have above average conflict scores; groups A1 and B1 have the above average population densities. Townships in groups A1 and A2 should be prioritised over the others.



2.3 Linking geographic prioritisation and beneficiary selection

Using the classifications from the simple decision tree in section 1.3, we can see that in rural areas, the highest proportions of people who are in the priority group are those who have been affected by conflict, followed by those who were affected by conflict and have lost work or employment opportunities. Rural areas severely-affected by conflict (the townships in group A2) are the areas in which we may reach populations with the highest proportions of households in the priority group.


Where are the highest proportions of persons in priority groups?
Rural Shocks_Conflict Shocks_Lost_Work %_Priority
no no yes 42.13
yes no yes 42.21
yes yes no 65.95
yes yes yes 61.27
Data sources: ACLED; acleddata.com and FAO-WFP


In urban areas, however, conflict incidence is not as important of a determining factor – the best results can be achieved by targeting people who have lost work or employment opportunities, irrespective of whether or not they have been affected by conflict.


Which areas have less people in the priority group?
Rural Shocks_Conflict Shocks_Lost_Work %_Priority
no no no 18.47
no yes no 22.36
no yes yes 25.34
yes no no 34.51
Data sources: ACLED; acleddata.com and FAO-WFP


As mentioned earlier, rural households were found to be less resilient and more asset-poor in IFPRI’s household welfare survey. These findings align well with the process the Food Security Cluster has developed here to identify priority households (where rural households are significantly more likely to fall into the priority group). It would be extremely fruitful to explore whether this alignment extends to conflict and some of the other environmental and socioeconomic variables that have been employed in this document.



2.4 Maps of conflict scores and prioritisation group



2.5 Reference table for conflict variables

Below is an interactive reference table for the various types of conflict events by township. It also includes the overall conflict score and prioritisation groups. The search bar can be used to find specific townships, or any of the columns may be sorted according to ascending or descending values. The table currently shows townships in descending order of conflict score.





3. Distribution of flood risk in Myanmar

3.1 Historical flood data

In light of the impending monsoon season, the probability that a township will be affected by a major flood or cylconic event has been calculated. Major floods since 2008 have been factored into this calculation.

For the moment, conflict incidence and flood and cyclone risk will be evaluated separately. Flood and storm surge risk exist as probabilities for the moment and are intended to support prepositioning and Disaster Risk Reduction; this might change were severe flooding to occur in 2022.



Based on this data, a score was calculated for each township based on how many times it had been affected by floods since 2008. The table below also summarises the number of people in need (2022). 2,210,725 people live in townships that have flooded more than 5 times since 2008.

Summary statistics by number of floods (2008-2021)
flood_count townships people_in_need
9 1 55,490
8 4 333,874
7 7 292,124
6 15 565,632
5 23 963,605
4 33 1,769,108
3 54 2,735,536
2 70 2,994,977
1 73 2,213,089
0 50 1,299,033
Data source: MIMU and UNDP



3.2 Map of flood risk

The map below shows the probability of each township being affected by floods. The areas with the greatest risk of flooding are in Mon, near the mouth of the Sittaung River and the Gulf of Mottama and those along the Ayeyarwady River, and to a lesser extent, along the Chindwin River.




3.3 Reference table for flood risk

Below is an interactive reference table for flood risk by township. It includes the number of times since 2008 a township has been affected by flooding (flood_count) and the probability of flooding (flood_risk). Similar to the interactive table in the previous chapter, the search bar can be used to find specific townships and any of the columns may be sorted according to ascending or descending values. The table currently shows townships sorted in descending order of flood risk.





4. Technical notes

These annexes contain additional technical information that informed the decisions in the earlier sections.

4.1 Limitations of the FAO-WFP survey Next steps

The most important limitation of the FAO-WFP survey was the exclusion of several key states and regions from the survey. Of particular interest are Sagaing, Magway and Mandalay where the conflict has been particularly intense.

Furthermore, the dry zone was not surveyed. From an agricultural perspective, this is a major omission as the diversity of crops and, consequently, diets are much higher in the dry zone than in the other parts of the country, which are predominantly focused on paddy.

In spite of these major limitations and the numerous assumptions that have had to made, the FAO-WFP survey is most comprehensive dataset on food security that has been collected so far. Additional efforts will be made to cross-reference these data from those of other surveys. These models will be updated once the third round of the FAO-WFP survey is ready. As a final point in this section, the FAO-WFP survey, in spite of its limitations forms the basis of the People in Need calculations.

This paper serves a proposal on how vulnerable households (such as those in the priority group) may be identified and targeted. Should this methodology prove sound and viable, it is suggested that it be applied to either IFPRI’s Household Welfare Survey as well as data collected in the third round of the FAO-WFP food security survey.



4.2 Calculation of the food insecurity score

Food insecurity here is not recognised solely as a food secure/food insecure dichotomy and is instead treated as a matter of degree determined by an household’s position the overall distribution of food security indicators. According to Betti and Verma, “by appropriately weighting non-monetary indicators of deprivation to reflect their dispersion and correlation, it is possible to construct quantitative indices of deprivation in its various dimensions”. At its most basic, the food insecurity score is a weighted average of its component indicators that rewards variables that are responsible for more of the variation in the dataset.

To calculate the food insecurity score, variables within the Livelihood Coping Strategies Index, Food Consumption Score and Food Insecurity Experience scale were rescaled to values between \(0\) and \(1\). For most of the variables, \(1\) meant “yes” and \(0\) meant “no”; however, for the Food Consumption Score indicators, \(0\) meant that a household had consumed that food group every day for the past 7 days and \(1\) meant that a household had not consumed that food group for any of the prior 7 days. Additionally, coping strategies indicators at the “crisis” level were coded as \(0.5\) for “yes” and indicators at the “emergency” level were coded as \(1\) for “yes”. This is to replace the typical severity weighting that would normally have occurred but was not part of the FAO-WFP survey process.

These calculations have been encoded in the R package mdepriv by Attilio and Aldo Benini, building on work done by Alperin and Van Kerm on their mdepriv Stata package. According to Alperin and Van Kerm, “mdepriv creates synthetic scores of deprivation that are linear functions of uni-dimensional deprivation items measured on the [0, 1] scale. With \(x_{ij}\) denoting the value of a particular deprivation items \(j\) for observation \(i\). The synthetic scores calculated by mdepriv are weighted sums of the \(M\) deprivation items:

\[ s_i = \sum_{j = 1}^{M}{w_j}x_{ij} \]

A food insecurity score was then calculated using the weighted sum of the individual variables. The weighting scheme chosen was the default for the mdepriv package, Cerioli and Zani (1990) weighting. Under this weighting scheme, variable weights are “frequency-based” and are a function of their sample mean but just slightly modified to give a stronger weight to relatively rare items so that variation is rewarded:

\[ w_j \propto log(\frac{1}{\bar{x}_j}) \]

The specific code for generating the food insecurity score was:

food_insecurity_score <- survey %>% 
  mutate_at(vars(cs_crisis_sold_prod_assets, cs_crisis_no_school, 
                 cs_crisis_reduced_health_exp), ~ . * 0.5) %>% 
  select(survey_id, fcs_staple, fcs_pulse, fcs_dairy, 
         fcs_protein, fcs_veg, fcs_fruit, fcs_fat, fcs_sugar, 
         cs_crisis_sold_prod_assets, cs_crisis_no_school, cs_crisis_reduced_health_exp, 
         cs_emergency_sold_house, cs_emergency_hh_migration, cs_emergency_hh_risk,
         fies_fewfood, fies_skipped, fies_whlday, fies_hungry, fies_ateless, fies_healthy,
         fies_runout, fies_worried) %>% 
  mdepriv(c("fcs_staple", "fcs_pulse", "fcs_dairy", 
            "fcs_protein", "fcs_veg", "fcs_fruit", "fcs_fat", "fcs_sugar",
            "cs_crisis_sold_prod_assets", "cs_crisis_no_school", 
            "cs_crisis_reduced_health_exp", "cs_emergency_sold_house", 
            "cs_emergency_hh_migration", "cs_emergency_hh_risk", 
            "fies_fewfood", "fies_skipped", "fies_whlday", "fies_hungry", "fies_ateless", 
            "fies_healthy", "fies_runout", "fies_worried"), 
          output = "all", method = "cz")



4.3 Limited performance of linear regression models

Prior to the development of the decision tree detailed in section 1.3, a linear regression model had been considered. However, no matter how sophisticated the method, the highest r-squared achieved was 0.136 (a model with an r-squared with 1 would mean it was perfectly predictive and an r-squared of 0 means that a model does not predict any of the variance at all; in this case, the best linear regression model still left 86% of the variance unexplained).

With reference to the plot below of predicted values of the food security score vs the actual values (of the best performing model), whilst there is a significant relationship, its predictive performance is too weak. This was why a decision tree was employed instead of a linear model. Each point in the plot below is a household in the survey.



The relatively low r-squared is likely due to missing variables in the FAO-WFP survey. For instance, the factors that go into a household’s decision to reduce their healthcare expenditures are too multifarious to be captured by a survey on food security.

This pattern was also true for the overall food security score as well as the individual food security indices (Food Consumption Score, Food Insecurity Experience Scale and Coping Strategies Index).

For additional reference, the table below shows the top 15 variables ranked by the percentage of variance of the food security score that they explain.

Variables ranked by percent of variance
term pc_variance
Residuals 86.34
shocks_none 4.14
income_ms_stable_non_ag 2.42
rural 2.03
shocks_lostwork 0.88
income_ms_selfem_nonwork 0.71
not_improved_sanitation 0.55
age_18_40 0.48
income_ms_agriculture 0.45
shocks_conflict 0.44
income_ms_livestock 0.35
shocks_naturalhazard 0.34
shocks_pricesother 0.33
age_41_65 0.12
shocks_accessmarket 0.12



4.4 Pairwise correlations of indicators in the FAO-WFP survey

The table below shows the top 20 correlations between the different variables collected by the FAO-WFP food security survey. When a particular variable is of interest, it may be useful and interesting to see which other variables it is most correlated with.

The vast majority of the variables, with the exception of composite scores and indices, are binary, with 1 being true and 0 being false. In these cases, a correlation of 1 would mean that a variable is true for all the households in which its match is also true; a correlation of 0.5 means that a variable is true for 50% of the households in which its match is true.

For instance, whether or not the head of the household has competed education (edu_higher) is most correlated with households whose main income source is stable non-agricultural income (income_ms_stable_non_ag). Similarly, a correlation of 0.175 between rural and edu_none indicates that in 17.5% of all rural households, the head of household has no formal educational attainment. It also should be noted that the components of each of the food security indices are most correlated with each other.




4.5 Calculating the conflict score

The conflict score here originally appeared in the Food Security Cluster’s report Understanding Conflict Dynamics in Myanmar through Conflict and Incident Data: A Food Security Perspective. It was calculated using ACLED data and yields a score for each township.

The conflict score is an update of the conflict index in the MIMU-HARP Vulnerability Analysis, using 2021 data. The specific conflict variables that included in the score were battles, explosions and remote violence, non-peaceful protests and riots, conflict-related fatalities, strategic developments and number of IDPs.

The conflict score is an average of the normalised values of key conflict indicators. Its main use it to aid decisions about geographic prioritisation. These normalised values have been re-weighted with Betti-Verma method, which penalises redundancy and rewards variation; this is the only notable divergence from the MIMU-HARP methodology. The Betti-Verma method was employed through the mdepriv package developed by Attilio and Aldo Benini. The specific formula used in the development of the score can found by downloading the code at the top-right corner of the page.

However, it must be noted that whilst the scores themselves can be shared and used, replicating all the calculations will necessitate obtaining permission from UNHCR as their township-level breakdown of IDP populations have not been shared publicly. The Food Security Cluster regrets this limitation and is actively advocating for increased data transparency and sharing between humanitarian actors.

LS0tDQp0aXRsZTogIk5vdGVzIG9uIFByZWxpbWluYXJ5IFRvd25zaGlwIFByaW9yaXRpc2F0aW9uIGFuZCBCZW5lZmljaWFyeSBTZWxlY3Rpb24iDQphdXRob3I6ICJNeWFubWFyIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciINCmRhdGU6ICIyNS8wMy8yMDIyIg0Kb3V0cHV0OiANCiAgaHRtbF9kb2N1bWVudDoNCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlDQogICAgdGhlbWU6IHJlYWRhYmxlDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2RlcHRoOiA0DQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGNvbGxhcHNlZDogZmFsc2UNCmFsd2F5c19hbGxvd19odG1sOiB0cnVlICAgDQotLS0NCg0KYGBge2NzcywgZWNobz1GQUxTRX0NCg0KI1RPQzo6YmVmb3JlIHsNCiAgY29udGVudDogIiI7DQogIGRpc3BsYXk6IGJsb2NrOw0KICBoZWlnaHQ6IDcwcHg7DQogIG1hcmdpbjogMmVtIDIwcHggNDBweCAyMHB4Ow0KICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoIk15YW5tYXJfY2x1c3Rlcl9ibHVlLnBuZyIpOw0KICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47DQogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7DQogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7DQp9DQpgYGANCg0KYGBgez1odG1sfQ0KPHN0eWxlPg0KICAgIGJvZHkgLm1haW4tY29udGFpbmVyIHsNCiAgICAgICAgbWF4LXdpZHRoOiAxMjgwcHg7DQogICAgfQ0KPC9zdHlsZT4NCmBgYA0KDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgZmlnLndpZHRoPTksIG1lc3NhZ2UgPSBGQUxTRSwgd2FybmluZz1GQUxTRSkNCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShyZWFkeGwpDQpsaWJyYXJ5KGhhdmVuKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KHN0cmluZ2kpDQpsaWJyYXJ5KHBhbmRlcikNCmxpYnJhcnkoamFuaXRvcikNCmxpYnJhcnkoc2NhbGVzKQ0KbGlicmFyeShtYWdyaXR0cikNCmxpYnJhcnkoc2YpDQpsaWJyYXJ5KHMyKQ0KbGlicmFyeShib29rZG93bikNCmxpYnJhcnkocGF0Y2h3b3JrKQ0KbGlicmFyeShrYWJsZUV4dHJhKQ0KbGlicmFyeShEVCkNCmxpYnJhcnkodmlyaWRpcykNCmxpYnJhcnkobWRlcHJpdikNCmxpYnJhcnkocHN5Y2gpDQpsaWJyYXJ5KHdpZHlyKQ0KbGlicmFyeShycGFydCkNCmxpYnJhcnkocnBhcnQudXRpbHMpDQpsaWJyYXJ5KHJhdHRsZSkNCmxpYnJhcnkoYnJvb21zdGljaykNCmxpYnJhcnkoY29ycnBsb3QpDQpsaWJyYXJ5KGJyb29tKQ0KbGlicmFyeSh0aWR5dGV4dCkNCmxpYnJhcnkocGxvdGx5KQ0KDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCg0KdGhlbWVfc2V0KHRoZW1lX21pbmltYWwoKSkNCg0KIyBkaXNhYmxpbmcgc2NpZW50aWZpYyBub3RhdGlvbg0Kb3B0aW9ucyhzY2lwZW4gPSA5OTkpDQoNCiMgcGFuZGVyIHRhYmxlcyBhbGwgaW4gb25lIHJvdw0KcGFuZGVyT3B0aW9ucygndGFibGUuc3BsaXQudGFibGUnLCBJbmYpDQoNCiMgcGFuZGVyIHRob3VzYW5kcyBzZXBhcmF0b3INCnBhbmRlck9wdGlvbnMoImJpZy5tYXJrIiwgIiwiKQ0KDQojIHJlcGxhY2UgDQpvcHRzIDwtIG9wdGlvbnMoa25pdHIua2FibGUuTkEgPSAiIikNCg0KYCVvdXQlYCA8LSBOZWdhdGUoYCVpbiVgKQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcw0Kc3VtX2JlbiA8LSBmdW5jdGlvbihkZiwgY29sdW1uX3Zhcil7DQogIA0KICBjb2x1bW5fdmFyIDwtIGVucXVvKGNvbHVtbl92YXIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIpICU+JSAjIG11c3QgYWRkIGJhbmctYmFuZw0KICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSAlPiUgDQogICAgYXJyYW5nZShkZXNjKGJlbmVmaWNpYXJpZXMpKQ0KICAgIA0KfQ0KDQojIGZ1bmN0aW9uIGJlbmVmaWNpYXJ5IHN1bW1hcmllcywgMiBncm91cGVkIHZhcmlhYmxlcw0Kc3VtX2JlbjIgPC0gZnVuY3Rpb24oZGYsIGNvbHVtbl92YXIxLCBjb2x1bW5fdmFyMil7DQogIA0KICBjb2x1bW5fdmFyMSA8LSBlbnF1byhjb2x1bW5fdmFyMSkNCiAgY29sdW1uX3ZhcjIgPC0gZW5xdW8oY29sdW1uX3ZhcjIpDQogIA0KICBkZiAlPiUNCiAgICBncm91cF9ieSghIWNvbHVtbl92YXIxLCAhIWNvbHVtbl92YXIyKSAlPiUgIyBtdXN0IGFkZCBiYW5nLWJhbmcNCiAgICBzdW1tYXJpc2UoYmVuZWZpY2lhcmllcyA9IHN1bShiZW5lZmljaWFyaWVzKSkgJT4lIA0KICAgIGFycmFuZ2UoZGVzYyhiZW5lZmljaWFyaWVzKSkNCiAgICANCn0NCg0KIyBzY2FsaW5nIGZ1bmN0aW9ucyANCnJhbmdlMDEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgpKS8obWF4KHgpLW1pbih4KSl9DQpyYW5nZV93bmEgPC0gZnVuY3Rpb24oeCl7KHgtbWluKHgsIG5hLnJtID0gVFJVRSkpLyhtYXgoeCwgbmEucm0gPSBUUlVFKS1taW4oeCwgbmEucm0gPSBUUlVFKSl9DQoNCiNtb2RlIGZ1bmN0aW9uIA0KbW9kZSA8LSBmdW5jdGlvbih4KSB7DQogIHV4IDwtIHVuaXF1ZSh4KQ0KICB1eFt3aGljaC5tYXgodGFidWxhdGUobWF0Y2goeCwgdXgpKSldDQp9DQoNCg0KIyByZWFkaW5nIGluIFBJTg0KcGluIDwtIHJlYWRfZXhjZWwoImhwY19waW4ueGxzeCIpDQoNCiMgcGNvZGVzDQpwY29kZXMgPC0gcmVhZF9leGNlbCgiTXlhbm1hciBQQ29kZXMgUmVsZWFzZV85LjNfSmFuMjAyMV8oU3RSZ25fRGlzdF9Uc3BfVG93bl9XYXJkX1ZUKS54bHN4IiwNCiAgICAgICAgICAgICAgICAgICAgIHNoZWV0ID0gIjAzX1Rvd25zaGlwIikgJT4lDQogIHJlbmFtZShhZG1pbjFfcGNvZGUgPSBTUl9QY29kZSwNCiAgICAgICAgIHN0YXRlID0gU1JfTmFtZV9FbmcsDQogICAgICAgICBhZG1pbjNfcGNvZGUgPSBUc3BfUGNvZGUsDQogICAgICAgICB0b3duc2hpcCA9IFRvd25zaGlwX05hbWVfRW5nLA0KICAgICAgICAgYWRtaW4yX3Bjb2RlID0gYERpc3RyaWN0L1NBWl9QY29kZWAsIA0KICAgICAgICAgZGlzdHJpY3QgPSBgRGlzdHJpY3QvU0FaX05hbWVfRW5nYCkNCg0KIyBzaGFwZWZpbGVzDQpwY29kZTNfc2hhcGUgPC0gc3RfcmVhZCgiQzovVXNlcnMvc2VhbnkvRG93bmxvYWRzL1IvYWNsZWQvbW1yX3BvbGJuZGFfYWRtM19taW11XzI1MGsvbW1yX3BvbGJuZGFfYWRtM19taW11XzI1MGsuc2hwIiwgDQogICAgICAgICAgICAgICAgICAgICAgICBxdWlldCA9IFRSVUUpICU+JSANCiByZW5hbWUoc3RhdGUgPSBTVCwgDQogICAgICAgIGFkbWluMV9wY29kZSA9IFNUX1BDT0RFLA0KICAgICAgICB0b3duc2hpcCA9IFRTLA0KICAgICAgICBhZG1pbjNfcGNvZGUgPSBUU19QQ09ERSkgJT4lIA0KIG11dGF0ZShhZG1pbjNfcGNvZGUgPSBpZmVsc2Uoc3RyX2RldGVjdCh0b3duc2hpcCwgIkhsYWluZ3RoYXJ5YSIpLCAiTU1SMDEzMDA4IiwgYWRtaW4zX3Bjb2RlKSkNCg0KcGNvZGUxX3NoYXBlIDwtIHN0X3JlYWQoIkM6L1VzZXJzL3NlYW55L0Rvd25sb2Fkcy9SL2FjbGVkL21tcl9wb2xibmRhMl9hZG0xX21pbXVfMjUway9tbXJfcG9sYm5kYTJfYWRtMV9taW11XzI1MGsuc2hwIiwgcXVpZXQgPSBUUlVFKSAlPiUgDQogcmVuYW1lKHN0YXRlID0gU1QsIA0KICAgICAgICBhZG1pbjFfcGNvZGUgPSBTVF9QQ09ERSkgJT4lIHN0X2FzX3NmKCkNCg0KIyByZWFkaW5nIGluIDVXcw0KZnNjIDwtIHJlYWRfY3N2KCJDOi9Vc2Vycy9zZWFueS9Eb3dubG9hZHMvUi9hY2xlZC9mc2M1d18yMDIxLmNzdiIpDQoNCiMgcmVhZGluZyBpbiB2dWxuZXJhYmlsaXR5IGRhdGFzZXQNCnZ1bG1tciA8LSByZWFkX2V4Y2VsKCJDOi9Vc2Vycy9zZWFueS9Eb3dubG9hZHMvUi9tbXJfNXdfaW5pdGlhbF9vYnNlcnZhdGlvbnMvRGF0YXNldHNfVnVsbmVyYWJpbGl0eV9BbmFseXNpc19pbl9NeWFubWFyXzA5SnVsMjAxOCAoMSkueGxzeCIsDQogICAgICAgICAgIHNraXAgPSAxKSAlPiUgDQogIHNsaWNlKC1jKDE6MykpICU+JSANCiAgY2xlYW5fbmFtZXMoKSAlPiUgDQogIHNlbGVjdCgtbGFiZWwpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMobnVtYmVyX29mX3ZpbGxhZ2VfdHJhY3RzOndiX3dlYWx0aF9yYW5rKSwgYXMubnVtZXJpYykgJT4lIA0KICBtdXRhdGVfYXQodmFycyhkaXNhc3RlcnNfaW1wYWN0ZWRfYnlfbmFyZ2lzXzIwMDg6YWNsZWRfMjAxNV8yMDE2X2RhdGFfZXhpc3RzKSwgYXMubG9naWNhbCkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjb25mbGljdF8yMDE1XzIwMTZfbnVtYmVyX29mX2JhdHRsZXM6Y29ycmVjdGVkX2NvbmZsaWN0X2luZGV4X2dhcnJ5KSwgYXMubnVtZXJpYykgJT4lIA0KICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ4IikpICU+JSANCiAgc2VsZWN0KC1jKHByaXZhdGVfc2VjdG9yX2RldmVsb3BtZW50XzIwMTRfMjAxNSwgcHJvdGVjdGlvbl8yMDEwXzIwMTUsIHNoZWx0ZXJfMjAxMF8yMDE1LCB3YXNoXzIwMTBfMjAxNSkpDQoNCiMgcmVhZGluZyBpbiBjb25mbGljdCBzY29yZQ0KY29uZmxpY3Rfc2NvcmUgPC0gcmVhZF9jc3YoImNvbmZsaWN0X3Njb3JlMi5jc3YiKQ0KDQojIHNob3dfY29sKHZpcmlkaXNfcGFsKCkoMTApKQ0KDQpmbG9vZHNfc3Rvcm1fc3VyZ2UgPC0gcmVhZF9leGNlbCgiRmxvb2RfQWZmZWN0ZWRfVG93bnNoaXBfKDIwMDgtMjAyMSkgKDEpLnhsc3giKSAlPiUgDQogIGNsZWFuX25hbWVzKCkgJT4lIA0KICByZW5hbWUoc3RhdGUgPSBzdCwgdG93bnNoaXAgPSB0cywgYWRtaW4xX3Bjb2RlID0gc3RfcGNvZGUsIGFkbWluM19wY29kZSA9IHRzX3Bjb2RlKSAlPiUgDQogIG11dGF0ZSh5ZWFyXzIwMDhfc3Rvcm1fc3VyZ2UgPSBpZmVsc2UoIWlzLm5hKHN0b3JtX3N1cmcpLCAxLCAwKSkgJT4lDQogIG11dGF0ZSh5ZWFyXzIwMDggPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAwOCIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAwOSA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDA5IiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDEwID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMTAiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMTEgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAxMSIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAxMiA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDEyIiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDEzID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMTMiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMTQgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAxNCIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAxNSA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDE1IiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDE2ID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMTYiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMTcgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAxNyIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAxOCA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDE4IiksIDEsIDApLA0KICAgICAgICAgeWVhcl8yMDE5ID0gaWZlbHNlKHN0cl9kZXRlY3QoZmxvb2RfeWVhciwgIjIwMTkiKSwgMSwgMCksDQogICAgICAgICB5ZWFyXzIwMjAgPSBpZmVsc2Uoc3RyX2RldGVjdChmbG9vZF95ZWFyLCAiMjAyMCIpLCAxLCAwKSwNCiAgICAgICAgIHllYXJfMjAyMSA9IGlmZWxzZShzdHJfZGV0ZWN0KGZsb29kX3llYXIsICIyMDIxIiksIDEsIDApKSAlPiUNCiAgcmVuYW1lKGZsb29keWVhcnMgPSBmbG9vZF95ZWFyKSAlPiUgDQogIG11dGF0ZSgNCiAgICBmbG9vZF9wcm9iID0gc2VsZWN0KC4sIHN0YXJ0c193aXRoKCJ5ZWFyXyIpKSAlPiUgcm93TWVhbnMobmEucm0gPSBUUlVFKSwNCiAgICBmbG9vZF9jb3VudCA9IHNlbGVjdCguLCBzdGFydHNfd2l0aCgieWVhcl8iKSkgJT4lIHJvd1N1bXMobmEucm0gPSBUUlVFKSkNCg0KIyBtYWluIGRhdGFzZXQgZm9yIHRoaXMgbm90ZQ0KZnNfcGluIDwtIHBpbiAlPiUgDQogIGxlZnRfam9pbihjb25mbGljdF9zY29yZSAlPiUgc2VsZWN0KGFkbWluM19wY29kZSwgYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHByb3Rlc3RzX2FuZF9yaW90cywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMsIHZpb2xlbmNlX2FnYWluc3RfY2l2aWxpYW5zLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3Rfc2NvcmUgPSBzY29yZV9pLCBmYXRhbGl0aWVzKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKHZ1bG1tciAlPiUgc2VsZWN0KGFkbWluM19wY29kZSA9IHRvd25zaGlwX3Bjb2RlLCANCiAgICAgICAgICAgICAgICAgICAgIGFyZWFfc293bl9hY3JlcyA9IGFsbF9hcmVhX3Nvd2VkX21hbGksIHBvcHVsYXRpb25fZGVuc2l0eSksDQogICAgICAgICAgICBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihmbG9vZHNfc3Rvcm1fc3VyZ2UgJT4lIA0KICAgICAgICAgICAgICBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBmbG9vZF9wcm9iLCBmbG9vZF9jb3VudCksDQogICAgICAgICAgICBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGxlZnRfam9pbihmc2MgJT4lDQogICAgICAgICAgICAgIGZpbHRlcih1bmlxdWVfYmVuZWZpY2lhcmllcyA9PSAiWWVzIikgJT4lDQogICAgICAgICAgICAgIGdyb3VwX2J5KGFkbWluM19wY29kZSkgJT4lDQogICAgICAgICAgICAgIHN1bW1hcmlzZShiZW5lZmljaWFyaWVzXzIwMjEgPSBzdW0oYmVuZWZpY2lhcmllcyksDQogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0bmVyc18yMDIxID0gbl9kaXN0aW5jdChpbXBsZW1lbnRpbmdfcGFydG5lcnMpKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbGVmdF9qb2luKGZzYyAlPiUgZmlsdGVyKGRhdGUgPiAiMjAyMS0wOS0wMSIpICU+JQ0KICAgICAgICAgICAgICBncm91cF9ieShhZG1pbjNfcGNvZGUpICU+JQ0KICAgICAgICAgICAgICBzdW1tYXJpc2UoYmVuXzZfbW9udGhzID0gc3VtKGJlbmVmaWNpYXJpZXMpKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbXV0YXRlKG5vdF9pbl82bW9udGhzID0gaWZlbHNlKGlzLm5hKGJlbl82X21vbnRocyksIDEsIDApKSAlPiUgDQogIG11dGF0ZShmc19waW4gPSBpZmVsc2UoZnNfcGluID4gcG9wdWxhdGlvbl8yMDIxX3Byb2osIHBvcHVsYXRpb25fMjAyMV9wcm9qLCBmc19waW4pKSAlPiUgDQogIHJlcGxhY2VfbmEobGlzdChjb25mbGljdF9zY29yZSA9IDAsIGJlbmVmaWNpYXJpZXNfMjAyMSA9IDAsIHBhcnRuZXJzXzIwMjEgPSAwLCBmbG9vZF9wcm9iID0gMCkpICU+JSANCiAgbXV0YXRlKGNvbmZsaWN0X3JhbmtpbmcgPSBkZW5zZV9yYW5rKGRlc2MoY29uZmxpY3Rfc2NvcmUpKSwNCiAgICAgICAgIGZsb29kX3JhbmtpbmcgPSBkZW5zZV9yYW5rKGRlc2MoZmxvb2RfcHJvYikpLA0KICAgICAgICAgZnNfcGluX3JhbmtpbmcgPSBkZW5zZV9yYW5rKGRlc2MoZnNfcGluKSksDQogICAgICAgICBmc190YXJnZXRfcmFua2luZyA9IGRlbnNlX3JhbmsoZGVzYyhmc190YXJnZXRlZCkpLA0KICAgICAgICAgZnNfcGluX3BjID0gZnNfcGluIC8gc3VtKGZzX3BpbiksDQogICAgICAgICBwaW5fcG9wID0gZnNfcGluIC8gcG9wdWxhdGlvbl8yMDIxX3Byb2opICU+JSANCiAgbXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKGNvbmZsaWN0X3Njb3JlID49IG1lYW4oY29uZmxpY3Rfc2NvcmUpICYgcG9wdWxhdGlvbl9kZW5zaXR5ID49IDEwMDAgfiAiQTEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3Rfc2NvcmUgPj0gbWVhbihjb25mbGljdF9zY29yZSkgJiBwb3B1bGF0aW9uX2RlbnNpdHkgPCAxMDAwIH4gIkEyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0X3Njb3JlIDwgbWVhbihjb25mbGljdF9zY29yZSkgJiBwb3B1bGF0aW9uX2RlbnNpdHkgPj0gMTAwMCB+ICJCMSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdF9zY29yZSA8IG1lYW4oY29uZmxpY3Rfc2NvcmUpICYgcG9wdWxhdGlvbl9kZW5zaXR5IDwgMTAwMCB+ICJCMiIpKSANCg0KIyBzaG91bGQgaSBqdXN0IHJlYWQgaW4gdGhlIHdob2xlIHN1cnZleSBkYXRhc2V0IGhlcmU/IG9yIGp1c3QgcmVhZCBpbiB0aGUgY3N2DQojIGkgZG9uJ3QgcmVhbGx5IGtub3cgaWYgcGVvcGxlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBjbGVhbmluZyBwcm9jZXNzDQoNCmZhb19zdXJ2ZXkgPC0gcmVhZF9kdGEoIk1NUl9SMkhRX2NsZWFuZWRXdF9maW5hbC5kdGEiKSAlPiUgDQogIHphcF9sYWJlbHMoKQ0KDQpzdXJ2ZXkgPC0gZmFvX3N1cnZleSAlPiUgDQogIHJlbmFtZShhZG1pbjNfcGNvZGUgPSBhZG0zX3Bjb2RlKSAlPiUgDQogIGxlZnRfam9pbihwY29kZXMgJT4lIHNlbGVjdChhZG1pbjNfcGNvZGUsIHRvd25zaGlwLCBzdGF0ZSwgYWRtaW4xX3Bjb2RlLCBkaXN0cmljdCwgYWRtaW4yX3Bjb2RlKSwNCiAgICAgICAgICAgIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoY3Nfc3RyZXNzX2hoX2Fzc2V0czpjc19lbWVyZ2VuY3lfaGhfcmlzayksIA0KICAgICAgICAgICAgfmNhc2Vfd2hlbiguID09IDQgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IC4pKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGNzX3N0cmVzc19oaF9hc3NldHM6Y3NfZW1lcmdlbmN5X2hoX3Jpc2spLCANCiAgICAgICAgICAgIH5jYXNlX3doZW4oLiA9PSAxIH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgLiA9PSAyIH4gMCwgDQogICAgICAgICAgICAgICAgICAgICAgIC4gPT0gMSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpICU+JQ0KICBtdXRhdGUobGhjc2lfbWF4ID0gY2FzZV93aGVuKGxoY3NpX21heF9hZyA9PSAiTm9uZSIgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxoY3NpX21heF9hZyA9PSAiU3RyZXNzIiB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGhjc2lfbWF4X2FnID09ICJDcmlzaXMiIH4gMiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaGNzaV9tYXhfYWcgPT0gIkVtZXJnZW5jeSIgfiAzKSwNCiAgICAgICAgICAgICAgICAgIGxoY3NpX3JhbmdlID0gcmFuZ2UwMShsaGNzaV9tYXgpKSAlPiUNCiAgbXV0YXRlKGNzaV93ZWlnaHRlZCA9IChjc19jcmlzaXNfc29sZF9wcm9kX2Fzc2V0cyArIGNzX2NyaXNpc19ub19zY2hvb2wgKyBjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwKSAqIDAuNSArIA0KICAgICAgICAgICAoY3NfZW1lcmdlbmN5X3NvbGRfaG91c2UgKyBjc19lbWVyZ2VuY3lfaGhfbWlncmF0aW9uICsgY3NfZW1lcmdlbmN5X2hoX3Jpc2spICogMSwNCiAgICAgICAgIGNzaV93ZWlnaHRlZCA9IHJhbmdlX3duYShjc2lfd2VpZ2h0ZWQpKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGhoX2dlbmRlciwgZmV3Zm9vZCwgc2tpcHBlZCwgd2hsZGF5LCBodW5ncnksIGF0ZWxlc3MsIGhlYWx0aHksIHJ1bm91dCwgd29ycmllZCwgDQogICAgICAgICAgICAgICAgIGNycF9zYWxlc2RpZiwgYWNjZXNzbWFya2V0LCBuZWVkLCBjcnBfcHJvZGRpZiwgY3JvcGRpZmZpY3VsdHl1bnJlc3QsIGNyb3BzYWxlc2RpZmZpY3VsdHl1bnJlc3QpLCANCiAgICAgICAgICAgIH5jYXNlX3doZW4oLiA9PSAzIH4gTkFfcmVhbF8sIA0KICAgICAgICAgICAgICAgICAgICAgICAuID09IDQgfiBOQV9yZWFsXywgDQogICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAuKSkgJT4lIA0KICBtdXRhdGUoaG9oX2ZlbWFsZSA9IGNhc2Vfd2hlbihoaF9nZW5kZXIgPT0gMSB+IDAsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9nZW5kZXIgPT0gMiB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBoaF9nZW5kZXIpKSAlPiUNCiAgbXV0YXRlX2F0KHZhcnMoZmllc19mZXdmb29kID0gZmV3Zm9vZCwgZmllc19za2lwcGVkID0gc2tpcHBlZCwgDQogICAgICAgICAgICAgICAgIGZpZXNfd2hsZGF5ID0gd2hsZGF5LCBmaWVzX2h1bmdyeSA9IGh1bmdyeSwNCiAgICAgICAgICAgICAgICAgZmllc19hdGVsZXNzID0gYXRlbGVzcywgZmllc19oZWFsdGh5ID0gaGVhbHRoeSwNCiAgICAgICAgICAgICAgICAgZmllc19ydW5vdXQgPSBydW5vdXQsIGZpZXNfd29ycmllZCA9IHdvcnJpZWQsDQogICAgICAgICAgICAgICAgIGFjY2Vzc21hcmtldCwgbmVlZCwgY3JwX3NhbGVzZGlmLCBjcnBfcHJvZGRpZiwNCiAgICAgICAgICAgICAgICAgY3JvcGRpZmZpY3VsdHl1bnJlc3QsIGNyb3BzYWxlc2RpZmZpY3VsdHl1bnJlc3QpLA0KICAgICAgICAgICAgfmNhc2Vfd2hlbiguID09IDEgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgLiA9PSAyIH4gMCwgDQogICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiAwKSkgJT4lDQogIG11dGF0ZShub19hY2Nlc3NtYXJrZXQgPSBpZmVsc2UoYWNjZXNzbWFya2V0ID09IDEsIDAsIDEpKSAlPiUgDQogICMgYmUgY2FyZWZ1bCBoZXJlIC0tIHlvdSd2ZSBpbXB1dGVkIG1pc3NpbmcgZmllcyBkYXRhIGFzIDANCiAgIyB0aGlzIGlzIHRoZSBmaWVzIHJhdyBzY29yZSwgbm90IHN1cmUgaWYgaSBuZWVkIGFueSBhZGRpdGlvbmFsIHRyYW5zZm9ybWF0aW9ucyBhdCB0aGUgaGhkIGxldmVsDQogIG11dGF0ZShmaWVzX3JhdyA9IGZpZXNfZmV3Zm9vZCArIGZpZXNfc2tpcHBlZCArIGZpZXNfd2hsZGF5ICsgZmllc19odW5ncnkgKw0KICAgICAgICAgICBmaWVzX2F0ZWxlc3MgKyBmaWVzX2hlYWx0aHkgKyBmaWVzX3J1bm91dCArIGZpZXNfd29ycmllZCwgDQogICAgICAgICBmaWVzX3Jhd19yYW5nZSA9IHJhbmdlX3duYShmaWVzX3JhdykpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoaGhfd2VhbHRoX3RvaWxldCwgaGhfcmVzaWRlbmNldHlwZSwgaGhfZWR1Y2F0aW9uLA0KICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbl9jb21wLCBpbmNvbWVfc2VjX2NvbXAsIGluY29tZV90aGlyZF9jb21wLCANCiAgICAgICAgICAgICAgICAgY3JwX2FyZWFfY2hhbmdlLCBjcnBfaGFydl9jaGFuZ2UsIGNycF9zYWxlc3ByaWNlKSwNCiAgICAgICAgICAgIH5jYXNlX3doZW4oLiA9PSA2IH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgIC4gPT0gNyB+IE5BX3JlYWxfLCANCiAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IC4pKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGluY29tZV9tYWluX2NvbXAsIGluY29tZV9zZWNfY29tcCwgaW5jb21lX3RoaXJkX2NvbXAsIA0KICAgICAgICAgICAgICAgICBjcnBfYXJlYV9jaGFuZ2UsIGNycF9oYXJ2X2NoYW5nZSwgY3JwX3NhbGVzcHJpY2UpLA0KICAgICAgICAgICAgfnJhbmdlX3duYSguKSkgJT4lICAgDQogIG11dGF0ZShub3RfaW1wcm92ZWRfc2FuaXRhdGlvbiA9IGNhc2Vfd2hlbihoaF93ZWFsdGhfdG9pbGV0ID09IDEgfiAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX3dlYWx0aF90b2lsZXQgPT0gMiB+IDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfd2VhbHRoX3RvaWxldCA9PSAzIH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF93ZWFsdGhfdG9pbGV0ID09IDQgfiAxLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX3dlYWx0aF90b2lsZXQgPT0gNSB+IDEpKSAlPiUgDQogIG11dGF0ZShyZXNpZGVuY2VfdHlwZSA9IGNhc2Vfd2hlbihoaF9yZXNpZGVuY2V0eXBlID09IDEgfiAicmVzaWRlbmNlX3Blcm1hbmVudCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9yZXNpZGVuY2V0eXBlID09IDIgfiAicmVzaWRlbmNlX3JlY2VudF9taWdyYW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX3Jlc2lkZW5jZXR5cGUgPT0gMyB+ICJyZXNpZGVuY2VfcmV0dXJuZWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfcmVzaWRlbmNldHlwZSA9PSA0IH4gInJlc2lkZW5jZV9pZHAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfcmVzaWRlbmNldHlwZSA9PSA1IH4gInJlc2lkZW5jZV9yZWZ1Z2VlIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXykpICU+JSANCiAgbXV0YXRlKGhvaF9lZHVjYXRpb24gPSBjYXNlX3doZW4oaGhfZWR1Y2F0aW9uID09IDEgfiAiZWR1X25vbmUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9lZHVjYXRpb24gPT0gMiB+ICJlZHVfcHJpbWFyeSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhoX2VkdWNhdGlvbiA9PSAzIH4gImVkdV9zZWNvbmRhcnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9lZHVjYXRpb24gPT0gNCB+ICJlZHVfaGlnaGVyIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhfZWR1Y2F0aW9uID09IDUgfiAiZWR1X3JlbGlnaW91cyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBOQV9jaGFyYWN0ZXJfKSkgJT4lDQogIG11dGF0ZV9hdCh2YXJzKGhoX2FnZSwgaW5jb21lY2hhbmdlcmVkdWNlZCwgd2hlcmVtaWdyYXRpb24sIG1lYWxzLCBoaF9hZ3JpY2FjdGl2aXR5KSwNCiAgICAgICAgICAgIH5jYXNlX3doZW4oLiA9PSA1IH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgIC4gPT0gNiB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gLikpICU+JSANCiAgbXV0YXRlKGhvaF9hZ2UgPSBjYXNlX3doZW4oaGhfYWdlID09IDEgfiAiYWdlX3VuZGVyMTgiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9hZ2UgPT0gMiB+ICJhZ2VfMThfNDAiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9hZ2UgPT0gMyB+ICJhZ2VfNDFfNjUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaF9hZ2UgPT0gNCB+ICJhZ2Vfb3ZlcjY1IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IE5BX2NoYXJhY3Rlcl8pKSAlPiUgDQogICAgbXV0YXRlKG1lYWxzX2ludiA9IGNhc2Vfd2hlbihtZWFscyA9PSA0IH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbHMgPT0gMyB+IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVhbHMgPT0gMiB+IDMsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lYWxzID09IDEgfiA0LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUgfiBtZWFscyksDQogICAgICAgICBtZWFsc19pbnYgPSByYW5nZV93bmEobWVhbHNfaW52KSkgJT4lIA0KICBtdXRhdGUoaW5jb21lX3JlZHVjZWQgPSBjYXNlX3doZW4oaW5jb21lY2hhbmdlcmVkdWNlZCA9PSA0IH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZWNoYW5nZXJlZHVjZWQgPT0gMyB+IDIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVjaGFuZ2VyZWR1Y2VkID09IDIgfiAzLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZWNoYW5nZXJlZHVjZWQgPT0gMSB+IDQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gaW5jb21lY2hhbmdlcmVkdWNlZCksDQogICAgICAgICBpbmNvbWVfcmVkdWNlZCA9IHJhbmdlX3duYShpbmNvbWVfcmVkdWNlZCkpICU+JSANCiAgIyB5b3UndmUgY2hhbmdlZCBhbGwgdGhlIE5BcyBpbiBhZ3JpYWN0aXZpdHkgdG8gMA0KICBtdXRhdGUoYWdyaV9hY3Rpdml0eSA9IGNhc2Vfd2hlbihoaF9hZ3JpY2FjdGl2aXR5ICVpbiUgYygxLCAyLCAzKSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSAlPiUNCiAgIyBmaWVzIGluZGljYXRvcnMgICAgIA0KICBtdXRhdGVfYXQodmFycyhmaWVzX3Jhbm91dF9oaHMsIGZpZXNfaHVuZ3J5X2hocywgZmllc193aGxkYXlfaGhzKSwNCiAgICAgICAgICAgICAgICB+Y2FzZV93aGVuKC4gPT0gNCB+IE5BX3JlYWxfLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLiA9PSA1IH4gTkFfcmVhbF8sDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gLikpICU+JSANCiAgICAgIG11dGF0ZV9hdCh2YXJzKGZpZXNfaHVuZ3J5X2hocywgZmllc19yYW5vdXRfaGhzLCBmaWVzX3dobGRheV9oaHMpLA0KICAgICAgICAgICAgICAgIH5jYXNlX3doZW4oLiA9PSAzIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAuID09IDIgfiAwLjUsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLiA9PSAxIH4gMC4yNSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gLikpICU+JQ0KICBtdXRhdGUoZXhwZW5zZWZvb2QzMGQgPSBjYXNlX3doZW4oZXhwZW5zZWZvb2QzMGQgPT0gMTEgfiBOQV9yZWFsXywgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZW5zZWZvb2QzMGQgPT0gMTIgfiBOQV9yZWFsXywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gZXhwZW5zZWZvb2QzMGQpKSAlPiUgDQogICAgICBtdXRhdGUoZXhwZW5zZV9mb29kID0gZXhwZW5zZWZvb2QzMGQgLyAxMCkgJT4lDQogICAgICAjIGZjcyBpbmRpY2F0b3JzDQogIG11dGF0ZShoaGZjc19pbnYgPSAxMTIgLSBISEZDUywNCiAgICAgICAgIGhoZmNzX2ludiA9IHJhbmdlX3duYShoaGZjc19pbnYpLA0KICAgICAgICAgZmNzX2JvcmRlcmxpbmVfcG9vciA9IGlmZWxzZShISEZDUyA8PSAzNSwgMSwgMCkpICU+JQ0KICBtdXRhdGVfYXQodmFycyhmY3NzdGFwLCBmY3NwdWxzZSwgZmNzZGFpcnksIGZjc3ByLCBmY3N2ZWcsIGZjc2ZydWl0LCBmY3NmYXQsIGZjc3N1Z2FyKSwNCiAgICAgICAgICAgICAgICB+IHJhbmdlX3duYSg3IC0gLikpICU+JQ0KICByZW5hbWVfd2l0aChzdHJfcmVwbGFjZSwgcGF0dGVybiA9ICJmY3MiLCByZXBsYWNlbWVudCA9ICJmY3NfIiwgbWF0Y2hlcygiZmNzIikpICU+JSAgDQogIHJlbmFtZShmY3NfcHJvdGVpbiA9IGZjc19wciwgZmNzX3N0YXBsZSA9IGZjc19zdGFwLCBoaGZjc19pbnYgPSBoaGZjc19faW52LCANCiAgICAgICAgIGZjc19ib3JkZXJsaW5lX3Bvb3IgPSBmY3NfX2JvcmRlcmxpbmVfcG9vcikgJT4lIA0KICBtdXRhdGUoaW5jb21lX3NvdXJjZSA9IGNhc2Vfd2hlbihpbmNvbWVfbWFpbiAlaW4lIGMoMSwgMiwgMywgNywgOCwgOSwgMTApIH4gImluY29tZV9tc19hZ3JpY3VsdHVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9tYWluID09IDQgfiAiaW5jb21lX21zX2xpdmVzdG9jayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9tYWluID09IDUgfiAiaW5jb21lX21zX2Zpc2hlcmllcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9tYWluICVpbiUgYygxMSwgMTMsIDE0KSB+ICJpbmNvbWVfbXNfc3RhYmxlX25vbl9hZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9tYWluICVpbiUgYyg2LCAxMikgfiAiaW5jb21lX21zX2Nhc3VhbF9ub25fYWciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoMTUsIDE2LCAxNywgMTgpIH4gImluY29tZV9tc19zZWxmZW1fbm9ud29yayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9tYWluICVpbiUgYygxOSwgMjApIH4gImluY29tZV9tc19ub19pbmNvbWUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJpbmNvbWVfbXNfc3RhYmxlX25vbl9hZyIpKSAlPiUNCiAgbGVmdF9qb2luKGZhb19zdXJ2ZXkgJT4lIA0KICAgICAgICAgICAgICBtdXRhdGUoaW5jb21lX3NvdXJjZSA9IGNhc2Vfd2hlbihpbmNvbWVfbWFpbiAlaW4lIGMoMSwgMiwgMywgNywgOCwgOSwgMTApIH4gImluY29tZV9tc19hZ3JpY3VsdHVyZSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9tYWluID09IDQgfiAiaW5jb21lX21zX2xpdmVzdG9jayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9tYWluID09IDUgfiAiaW5jb21lX21zX2Zpc2hlcmllcyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9tYWluICVpbiUgYygxMSwgMTMsIDE0KSB+ICJpbmNvbWVfbXNfc3RhYmxlX25vbl9hZyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9tYWluICVpbiUgYyg2LCAxMikgfiAiaW5jb21lX21zX2Nhc3VhbF9ub25fYWciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbWFpbiAlaW4lIGMoMTUsIDE2LCAxNywgMTgpIH4gImluY29tZV9tc19zZWxmZW1fbm9ud29yayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY29tZV9tYWluICVpbiUgYygxOSwgMjApIH4gImluY29tZV9tc19ub19pbmNvbWUiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJpbmNvbWVfbXNfc3RhYmxlX25vbl9hZyIpKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KHN1cnZleV9pZCwgaW5jb21lX3NvdXJjZSkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZSh2YWx1ZSA9IDEpICU+JQ0KICAgICAgICAgICAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaW5jb21lX3NvdXJjZSwgdmFsdWVzX2Zyb20gPSB2YWx1ZSwgdmFsdWVzX2ZpbGwgPSAwKSwNCiAgICAgICAgICAgIGJ5ID0gInN1cnZleV9pZCIpICU+JSANCiAgICAgICMgaW1wdXRlZCBpbmNvbWVfbWFpbl9ncm91cCB2YWx1ZSAtLSBsb29rIGF0IHRoZSAibWF5YmVfbGF0ZXIiIGJlbG93IHRvIHNlZSBob3cgaXQgd2FzIGRvbmUNCiAgICAgIG11dGF0ZShydXJhbCA9IGlmZWxzZShydXJhbHVyYmFuID09IDEsIDEsIDApKSAlPiUgDQogICAgICAjIGltcHV0ZWQgaG9oIHNleCAtLSBtb2RlDQogICAgICBtdXRhdGUoaG9oX2ZlbWFsZSA9IGlmZWxzZShpcy5uYShob2hfZmVtYWxlKSwgMCwgaG9oX2ZlbWFsZSkpICU+JSANCiAgICAgICMgaW1wdXRlZCBmaWVzX3Jhbm91dF9oaHMgLS0gbW9kZQ0KICAgICAgbXV0YXRlKGZpZXNfcmFub3V0X2hocyA9IGlmZWxzZShpcy5uYShmaWVzX3Jhbm91dF9oaHMpLCAxLCBmaWVzX3Jhbm91dF9oaHMpKSAlPiUgIA0KICBtdXRhdGUoc2hvY2tzX25vbmUgPSBzaG9ja19ub3Nob2NrLA0KICAgICAgICAgc2hvY2tzX2xvc3R3b3JrID0gc2hvY2tfbG9zdGVtcGxvcndvcmssIA0KICAgICAgICAgc2hvY2tzX3NpY2tuZXNzZGVhdGggPSBzaG9ja19zaWNrbmVzc29yZGVhdGhvZmhoLCANCiAgICAgICAgIHNob2Nrc19mb29kcHJpY2VzID0gc2hvY2tfaGlnaGVyZm9vZHByaWNlcywgDQogICAgICAgICBzaG9ja3NfY29uZmxpY3QgPSBzaG9ja192aW9sZW5jZWluc2VjY29uZiwgDQogICAgICAgICBzaG9ja3NfY2FudHdvcmtidXNpbmVzcyA9IHNob2NrX2NhbnR3b3Jrb3Jkb2J1c2luZXNzLCANCiAgICAgICAgIHNob2Nrc19uYXR1cmFsaGF6YXJkID0gaWZlbHNlKHNob2NrX2Zsb29kID4gMCB8IHNob2NrX2Ryb3VnaHQgPiAwIHwgc2hvY2tfaHVycmljYW5lID4gMCB8IHNob2NrX2xhbmRzbGlkZXMgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2tfZmlyZW5hdHVyYWwgPiAwIHwgc2hvY2tfb3RoZXJuYXRoYXphcmQgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2tfY29sZHRlbXBvcmhhaWwgPiAwLCAxLCAwKSwNCiAgICAgICAgIHNob2Nrc19hY2Nlc3NtYXJrZXQgPSBzaG9ja19uYXBhc3R1cmUsIA0KICAgICAgICAgc2hvY2tzX3ByaWNlc290aGVyID0gaWZlbHNlKHNob2NrX2hpZ2hlcmFncmlucHV0cHJpY2UgPiAwIHwgc2hvY2tfaGlnaGVyZnVlbHByaWNlcyA+IDAgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob2NrX290aGVyZWNvbm9taWNzaG9jayA+IDAgfCBzaG9ja19sb3dvdXRwdXRwcmljZSA+IDAsIDEsIDApLCANCiAgICAgICAgIHNob2Nrc19vdGhlciA9IGlmZWxzZShzaG9ja19vdGhlcmNyb3BhbmRsaXZlc3RzID4gMCB8IHNob2NrX290aGVyaW50cmFoaHNob2NrID4gMCB8IHNob2NrX290aGVybWFubWFkZWhhemFyZCA+IDAgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2tfYW5pbWFsZGlzZWFzZSA+IDAgfCBzaG9ja19wZXN0b3V0YnJlYWsgPiAwIHwgc2hvY2tfcGxhbnRkaXNlYXNlID4gMCB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvY2tfb3RoZXJjcm9wYW5kbGl2ZXN0cyA+IDAgfCBzaG9ja19vdGhlcmludHJhaGhzaG9jayA+IDAgfCBzaG9ja190aGVmdG9mcHJvZGFzc2V0cyA+IDAgLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QoaW5jb21lX21haW5fYW1vdW50ID0gMCwgaW5jb21lX3NlY19hbW91bnQgPSAwLCBpbmNvbWVfdGhpcmRfYW1vdW50ID0gMCkpICU+JSANCiAgbXV0YXRlKGluY29tZV90b3RhbF9hbW91bnQgPSBpbmNvbWVfbWFpbl9hbW91bnQgKyBpbmNvbWVfc2VjX2Ftb3VudCArIGluY29tZV90aGlyZF9hbW91bnQsDQogICAgICAgICBmb29kX2V4cGVuc2VzX21tayA9IGluY29tZV90b3RhbF9hbW91bnQgKiBleHBlbnNlX2Zvb2QsIA0KICAgICAgICAgaW5jb21lX3Blcl9jYXBpdGEgPSBpbmNvbWVfdG90YWxfYW1vdW50IC8gaGhfc2l6ZSkgJT4lDQogIG11dGF0ZShuZWVkc19mb29kID0gaWZlbHNlKG5lZWRfZm9vZCA+IDAsIDEsIDApLA0KICAgICAgICAgbmVlZHNfY2FzaCA9IGlmZWxzZShuZWVkX2Nhc2hhc3Npc3RhbmNlID4gMCwgMSwgMCksDQogICAgICAgICBuZWVkc19tZWRpY2FsID0gaWZlbHNlKG5lZWRfbWVkaWNhbHNlcnZpY2VzdXBwbHkgPiAwLCAxLCAwKSwNCiAgICAgICAgIG5lZWRzX2FncmkgPSBpZmVsc2UobmVlZF9mZXJ0aWxpemVycyA+IDAgfCBuZWVkX3Blc3RpY2lkZXMgPiAwIHwgbmVlZF90ZWNoc3VwcG9yZXh0ZW5zaW9uc2VydiA+IDAgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfYWNzdG9tZWNoYW5pc2VkZXF1aXBwcm9kID4gMHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2FjY2Vzc3RvbGFuZCA+IDAgfCBuZWVkX3NlZWRzID4gMCB8IG5lZWRfbGFuZHJlaGFiaWxpdGF0aW9uID4gMCB8IA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfYWNjZXNzdG9pcnJpZ2F0aW9ud2F0ZXIgPiAwIHwgbmVlZF9zdXBwb3J0Zm9ycHJvY2Vzc3Byb2QgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX2FncmlsYWJvdXIsIDEsIDApLA0KICAgICAgICAgbmVlZHNfam9ic2xvYW5zID0gaWZlbHNlKG5lZWRfbG9hbnMgPiAwIHwgbmVlZF9qb2JvcHBvcnR1bml0eSA+IDAsIDEsIDApLA0KICAgICAgICAgbmVlZHNfb3RoZXIgPSBpZmVsc2UobmVlZF9jbG90aGVzc2hlbHRlcndhdGVyID4gMCB8IG5lZWRfZWR1Y2F0aW9uYXNzaXN0YW5jZSA+IDAgfCBuZWVkX2Zpc2hlcXVpb3JvdGhlcnN1cHBmb3IgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9pbmZvb25zYWZldHltZWFzdXJlcyA+IDAgfCBuZWVkX21hcmtldGluZ3N1cHBvcnQgPiAwIHwgbmVlZF9vdGhlciA+IDAgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkX3N0b3JhZ2VlcXVpcG1lbnRvcmZhY2kgPiAwIHwgbmVlZF90b29scyA+IDAgfCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9yZXN0b2NraW5nYW5pbWFscyA+IDAgfCBuZWVkX3ZldGVyaW5hcnlzZXJ2aWNlcyA+IDAgfCBuZWVkX2FuaW1hbGZlZWQgPiAwIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZF9hbmltYWxzYWxlbWluZ2FyYW50ZHByaWNlID4gMCB8IG5lZWRfc3VwcHRyYW5zb2ZhbmltYWxzb3Jwcm9kID4gMCB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfc3BlY2lhbG51dHJpdGlvbmZvb2QgPiAwLCAxLCAwKSkgJT4lIA0KICByZXBsYWNlX25hKGxpc3QobmVlZHNfZm9vZCA9IDAsIG5lZWRzX2Nhc2ggPSAwLCBuZWVkc19tZWRpY2FsID0gMCwgbmVlZHNfYWdyaSA9IDAsIA0KICAgICAgICAgICAgICAgICAgbmVlZHNfam9ic2xvYW5zID0gMCwgbmVlZHNfb3RoZXIgPSAwKSkgJT4lIA0KICBzZWxlY3QoLWMoc2hvY2tfb3RoZXJzcGVjaWZ5LCBjb3ZpZF9vdGhlcnNwZWNpZnksc2hvY2tfcmVmLCBjb3ZpZF9yZWYsIHNob2NrX2RrLCBjb3ZpZF9kaywgDQogICAgICAgICAgICBjcnBfcHJvZGRpZl9vdGhlcnNwZWNpZnksIGNycF9zYWxlZGlmX290aGVyc3BlY2lmeSwgbHNfbnVtX2luY19kZWNfb3RoZXJzcGVjaWZ5LCANCiAgICAgICAgICAgIGxzX2Zvb2Rfc3VwcGx5X290aGVyc3BlY2lmeSwgbHNfcHJvZGRpZl9vdGhlcnNwZWNpZnksIG5lZWRfZGssIG5lZWRfb3RoZXJzcGVjaWZ5LA0KICAgICAgICAgICAgbHNfc2FsZXNkaWZfb3RoZXJzcGVjaWZ5LCBmaXNoX3NhbGVkaWZfb3RoZXJzcGVjaWZ5LCByZWFzb25zbWlncmF0aW9uX290aGVyc3BlY2lmeSwNCiAgICAgICAgICAgIGFkbTNfYXlleWFyd2FkeSwgYWRtM19jaGluLCBhZG0zX2thY2hpbiwgYWRtM19rYXlhaCwgYWRtM19rYXlhaCwgYWRtM19rYXlpbiwNCiAgICAgICAgICAgIGFkbTNfcmFraGluZSwgYWRtM19zaGFuX2Vhc3QsIGFkbTNfc2hhbl9ub3J0aCwgYWRtM195YW5nb24sIGFkbTNfbW9uKSkgJT4lICANCiAgbXV0YXRlKGZvb2RfZXhwZW5zZXNfcGVyX2NhcGl0YSA9IGZvb2RfZXhwZW5zZXNfbW1rIC8gaGhfc2l6ZSAvIDMsIA0KICAgICAgICAgbWViX3BjID0gZm9vZF9leHBlbnNlc19wZXJfY2FwaXRhIC8gKDE5MDU1NSAvIDUpKSAlPiUgDQogIA0KICBtdXRhdGUoYWdyaV9oaGQgPSBpZmVsc2UoaW5jb21lX21zX2FncmljdWx0dXJlID09IDEgfCBpbmNvbWVfbXNfZmlzaGVyaWVzID09IDEgfCBpbmNvbWVfbXNfbGl2ZXN0b2NrID09IDEgfA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ3JpX2FjdGl2aXR5ID09IDEgfCBpbmNvbWVfc2VjIDw9IDEwLCAxLCAwKSwNCiAgICAgICAgIGFncmlfbWFpbiA9IGlmZWxzZShpbmNvbWVfbXNfYWdyaWN1bHR1cmUgPT0gMSB8IGluY29tZV9tc19maXNoZXJpZXMgPT0gMSB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWVfbXNfZmlzaGVyaWVzID09IDEgfCBhZ3JpX2FjdGl2aXR5ID09IDEsIDEsIDApKSANCg0KIyBmc19zY29yZSBtZGVwcml2DQpmc19zaGFyZSA8LSBzdXJ2ZXkgJT4lICANCiAgc2VsZWN0KHN1cnZleV9pZCwgaGhmY3NfaW52LCBmaWVzX3JhdywgY3NpX3dlaWdodGVkKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGhoZmNzX2ludiwgZmllc19yYXcsIGNzaV93ZWlnaHRlZCksIHNjYWxlKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGhoZmNzX2ludiwgZmllc19yYXcsIGNzaV93ZWlnaHRlZCksIHJhbmdlX3duYSkgJT4lIA0KICBtZGVwcml2KGMoImhoZmNzX2ludiIsICJmaWVzX3JhdyIsICJjc2lfd2VpZ2h0ZWQiKSwgbWV0aG9kID0gImJ2Iiwgb3V0cHV0ID0iYWxsIikNCg0KIyBmc19zY29yY2UyIG1kZXByaXYNCmZzX3NoYXJlMiA8LSBzdXJ2ZXkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjc19jcmlzaXNfc29sZF9wcm9kX2Fzc2V0cywgY3NfY3Jpc2lzX25vX3NjaG9vbCwgY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCksIH4gLiAqIDAuNSkgJT4lIA0KICBzZWxlY3Qoc3VydmV5X2lkLCBmY3Nfc3RhcGxlLCBmY3NfcHVsc2UsIGZjc19kYWlyeSwgZmNzX3Byb3RlaW4sIGZjc192ZWcsIGZjc19mcnVpdCwgZmNzX2ZhdCwgZmNzX3N1Z2FyLCANCiAgICAgICAgIGNzX2NyaXNpc19zb2xkX3Byb2RfYXNzZXRzLCBjc19jcmlzaXNfbm9fc2Nob29sLCBjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwLCANCiAgICAgICAgIGNzX2VtZXJnZW5jeV9zb2xkX2hvdXNlLCBjc19lbWVyZ2VuY3lfaGhfbWlncmF0aW9uLCBjc19lbWVyZ2VuY3lfaGhfcmlzaywNCiAgICAgICAgIGZpZXNfZmV3Zm9vZCwgZmllc19za2lwcGVkLCBmaWVzX3dobGRheSwgZmllc19odW5ncnksIGZpZXNfYXRlbGVzcywgZmllc19oZWFsdGh5LA0KICAgICAgICAgICAgICAgICBmaWVzX3J1bm91dCwgZmllc193b3JyaWVkKSAlPiUgDQogIG1kZXByaXYoYygiZmNzX3N0YXBsZSIsICJmY3NfcHVsc2UiLCAiZmNzX2RhaXJ5IiwgImZjc19wcm90ZWluIiwgImZjc192ZWciLCAiZmNzX2ZydWl0IiwgImZjc19mYXQiLCAiZmNzX3N1Z2FyIiwgDQogICAgICAgICAiY3NfY3Jpc2lzX3NvbGRfcHJvZF9hc3NldHMiLCAiY3NfY3Jpc2lzX25vX3NjaG9vbCIsICJjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwIiwgDQogICAgICAgICAiY3NfZW1lcmdlbmN5X3NvbGRfaG91c2UiLCAiY3NfZW1lcmdlbmN5X2hoX21pZ3JhdGlvbiIsICJjc19lbWVyZ2VuY3lfaGhfcmlzayIsDQogICAgICAgICAiZmllc19mZXdmb29kIiwgImZpZXNfc2tpcHBlZCIsICJmaWVzX3dobGRheSIsICJmaWVzX2h1bmdyeSIsICJmaWVzX2F0ZWxlc3MiLCAiZmllc19oZWFsdGh5IiwNCiAgICAgICAgICJmaWVzX3J1bm91dCIsICJmaWVzX3dvcnJpZWQiKSwgb3V0cHV0ID0gImFsbCIpDQoNCmZzX3NoYXJlMyA8LSBzdXJ2ZXkgJT4lIA0KICBtdXRhdGVfYXQodmFycyhjc19jcmlzaXNfc29sZF9wcm9kX2Fzc2V0cywgY3NfY3Jpc2lzX25vX3NjaG9vbCwgY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCksIH4gLiAqIDAuNSkgJT4lIA0KICBzZWxlY3Qoc3VydmV5X2lkLCBmY3Nfc3RhcGxlLCBmY3NfcHVsc2UsIGZjc19kYWlyeSwgZmNzX3Byb3RlaW4sIGZjc192ZWcsIGZjc19mcnVpdCwgZmNzX2ZhdCwgZmNzX3N1Z2FyLCANCiAgICAgICAgIGNzX2NyaXNpc19zb2xkX3Byb2RfYXNzZXRzLCBjc19jcmlzaXNfbm9fc2Nob29sLCBjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwLCANCiAgICAgICAgIGNzX2VtZXJnZW5jeV9zb2xkX2hvdXNlLCBjc19lbWVyZ2VuY3lfaGhfbWlncmF0aW9uLCBjc19lbWVyZ2VuY3lfaGhfcmlzaywNCiAgICAgICAgIGZpZXNfZmV3Zm9vZCwgZmllc19za2lwcGVkLCBmaWVzX3dobGRheSwgZmllc19odW5ncnksIGZpZXNfYXRlbGVzcywgZmllc19oZWFsdGh5LA0KICAgICAgICAgICAgICAgICBmaWVzX3J1bm91dCwgZmllc193b3JyaWVkLCBjb21iaW5lZF93dCkgJT4lIA0KICBtZGVwcml2KGMoImZjc19zdGFwbGUiLCAiZmNzX3B1bHNlIiwgImZjc19kYWlyeSIsICJmY3NfcHJvdGVpbiIsICJmY3NfdmVnIiwgImZjc19mcnVpdCIsICJmY3NfZmF0IiwgImZjc19zdWdhciIsIA0KICAgICAgICAgImNzX2NyaXNpc19zb2xkX3Byb2RfYXNzZXRzIiwgImNzX2NyaXNpc19ub19zY2hvb2wiLCAiY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCIsIA0KICAgICAgICAgImNzX2VtZXJnZW5jeV9zb2xkX2hvdXNlIiwgImNzX2VtZXJnZW5jeV9oaF9taWdyYXRpb24iLCAiY3NfZW1lcmdlbmN5X2hoX3Jpc2siLA0KICAgICAgICAgImZpZXNfZmV3Zm9vZCIsICJmaWVzX3NraXBwZWQiLCAiZmllc193aGxkYXkiLCAiZmllc19odW5ncnkiLCAiZmllc19hdGVsZXNzIiwgImZpZXNfaGVhbHRoeSIsDQogICAgICAgICAiZmllc19ydW5vdXQiLCAiZmllc193b3JyaWVkIiksIG91dHB1dCA9ICJhbGwiLCBzYW1wbGluZ193ZWlnaHRzID0gImNvbWJpbmVkX3d0IikNCg0KIyBwcmlvcml0eSBzY29yZXMNCiMgcHJpb3JpdHkgc2NvcmVzDQpzdXJ2ZXkgPC0gc3VydmV5ICU+JQ0KICBsZWZ0X2pvaW4oZnNfc2hhcmUkZGF0YSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChzY29yZV9pLCBzdXJ2ZXlfaWQpLCBieSA9ICJzdXJ2ZXlfaWQiKSAlPiUgDQogIGxlZnRfam9pbihmc19zaGFyZTIkZGF0YSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChmc19zY29yZTIgPSBzY29yZV9pLCBzdXJ2ZXlfaWQpLCBieSA9ICJzdXJ2ZXlfaWQiKSAlPiUgDQogIGxlZnRfam9pbihmc19zaGFyZTMkZGF0YSAlPiUgDQogICAgICAgICAgICAgIHNlbGVjdChmc19zY29yZTMgPSBzY29yZV9pLCBzdXJ2ZXlfaWQpLCBieSA9ICJzdXJ2ZXlfaWQiKSAlPiUgDQogICBtdXRhdGUocHJpb3JpdHkxID0gY2FzZV93aGVuKGhoZmNzX2ludiA+PSBtZWFuKGhoZmNzX2ludikgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZXNfcmF3X3JhbmdlID49IG1lYW4oZmllc19yYXdfcmFuZ2UpICYgY3NpX3dlaWdodGVkID49IG1lYW4oY3NpX3dlaWdodGVkKSB+IDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSAlPiUNCiAgbXV0YXRlKHByaW9yaXR5MiA9IGlmZWxzZShzY29yZV9pID49IG1lYW4oc2NvcmVfaSksIDEsIDApKSAlPiUgDQogIG11dGF0ZShwcmlvcml0eTMgPSBjYXNlX3doZW4oaGhmY3NfaW52ID49IG1lYW4oaGhmY3NfaW52KSAmIGZpZXNfcmF3X3JhbmdlID49IG1lYW4oZmllc19yYXdfcmFuZ2UpIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhmY3NfaW52ID49IG1lYW4oaGhmY3NfaW52KSAmIGNzaV93ZWlnaHRlZCA+PSBtZWFuKGNzaV93ZWlnaHRlZCkgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVzX3Jhd19yYW5nZSA+PSBtZWFuKGZpZXNfcmF3X3JhbmdlKSAmIGNzaV93ZWlnaHRlZCA+PSBtZWFuKGNzaV93ZWlnaHRlZCkgfiAxLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gMCkpICU+JSANCiAgbXV0YXRlKHByaW9yaXR5ID0gY2FzZV93aGVuKGhoZmNzX2ludiA+PSBxdWFudGlsZShoaGZjc19pbnYsIHByb2JzID0gMC43NSkgJiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZXNfcmF3X3JhbmdlID49IHF1YW50aWxlKGZpZXNfcmF3X3JhbmdlLCBwcm9icyA9IDAuNzUpIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGhmY3NfaW52ID49IHF1YW50aWxlKGhoZmNzX2ludiwgcHJvYnMgPSAwLjc1KSAmIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NpX3dlaWdodGVkID49IHF1YW50aWxlKGNzaV93ZWlnaHRlZCwgcHJvYnMgPSAwLjc1KSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZXNfcmF3X3JhbmdlID49IHF1YW50aWxlKGZpZXNfcmF3X3JhbmdlLCBwcm9icyA9IDAuNzUpICYgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2lfd2VpZ2h0ZWQgPj0gcXVhbnRpbGUoY3NpX3dlaWdodGVkLCBwcm9icyA9IDAuNzUpIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSAlPiUgDQogIG11dGF0ZShwcmlvcml0eTUgPSBjYXNlX3doZW4oaGhmY3NfaW52ID49IHF1YW50aWxlKGhoZmNzX2ludiwgcHJvYnMgPSAwLjc1KSB+IDEsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZXNfcmF3X3JhbmdlID49IHF1YW50aWxlKGZpZXNfcmF3X3JhbmdlLCBwcm9icyA9IDAuNzUpIH4gMSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc2lfd2VpZ2h0ZWQgPj0gcXVhbnRpbGUoY3NpX3dlaWdodGVkLCBwcm9icyA9IDAuNzUpIH4gMSwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IDApKSAlPiUgDQogIHJlbmFtZShmc19zY29yZSA9IHNjb3JlX2kpDQoNCiMgc3VydmV5IGxvbmcNCg0Kc3VydmV5X2xvbmcgPC0gc3VydmV5ICU+JQ0KICBzZWxlY3Qoc3VydmV5X2lkLCBwcmlvcml0eSwgZnNfc2NvcmUsIGZzX3Njb3JlMiwgZnNfc2NvcmUzLCBtZWJfcGMsIA0KICAgICAgICAgY29udGFpbnMoImNzXyIpLCBjb250YWlucygiY3NpXyIpLCBjb250YWlucygiZmllcyIpLCBjb250YWlucygiZmNzXyIpLCBjb250YWlucygibmVlZHNfIiksIA0KICAgICAgICAgaGhmY3NfaW52LCBuZWVkLCANCiAgICAgICAgIGhvaF9mZW1hbGUsIHJ1cmFsLCBleHBlbnNlX2Zvb2QsIG5vdF9pbXByb3ZlZF9zYW5pdGF0aW9uLCBpbmNvbWVfbWFpbl9jb21wLCBhZ3JpX2FjdGl2aXR5LA0KICAgICAgICAgbGhjc2lfbWF4LCBsaGNzaV9yYW5nZSwgYWNjZXNzbWFya2V0KSAlPiUgDQogIHNlbGVjdCgtY29udGFpbnMoInd0IiksIC1ub3RlZmNzXywgLWxoY3NpX21heF9hZykgJT4lIA0KICBsZWZ0X2pvaW4oc3VydmV5ICU+JSBzZWxlY3Qoc3VydmV5X2lkLCBpbmNvbWVfc291cmNlLCBob2hfZWR1Y2F0aW9uLCBob2hfYWdlLCByZXNpZGVuY2VfdHlwZSkgJT4lIA0KICAgICAgICAgICAgICBwaXZvdF9sb25nZXIoY29scyA9IC1zdXJ2ZXlfaWQsIG5hbWVzX3RvID0gIm9sZF92YXIiLCB2YWx1ZXNfdG8gPSAidmFyIikgJT4lDQogICAgICAgICAgICAgIG11dGF0ZSh2YWx1ZSA9IDEpICU+JSANCiAgICAgICAgICAgICAgc2VsZWN0KC1vbGRfdmFyKSAlPiUgDQogICAgICAgICAgICAgIHBpdm90X3dpZGVyKG5hbWVzX2Zyb20gPSB2YXIsIHZhbHVlc19mcm9tID0gdmFsdWUsIHZhbHVlc19maWxsID0gMCksIGJ5ID0gInN1cnZleV9pZCIpICU+JQ0KICBwaXZvdF9sb25nZXIoY29scyA9IC1zdXJ2ZXlfaWQsIG5hbWVzX3RvID0gInZhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgcmJpbmQoc3VydmV5ICU+JSBzZWxlY3QoY29udGFpbnMoInNob2Nrc18iKSwgc3VydmV5X2lkKSAlPiUNCiAgICAgICAgICBwaXZvdF9sb25nZXIoY29scyA9IC1zdXJ2ZXlfaWQsIG5hbWVzX3RvID0gInZhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpKQ0KDQoNCiMgc2hvd19jb2wodmlyaWRpc19wYWwob3B0aW9uID0gImNpdmlkaXMiKSgxMCkpDQpgYGANCg0KDQoNCiMjIEludHJvZHVjdGlvbiANCg0KUHJpb3JpdGlzYXRpb24gY2FuIGxhcmdlbHkgYmUgYnJva2VuIGludG8gdHdvIHN0ZXBzIC0tIGdlb2dyYXBoaWMgcHJpb3JpdGlzYXRpb24gYW5kIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbi4gDQoNClRoaXMgZG9jdW1lbnQgZXhhbWluZXMgZGF0YSBmcm9tIHRoZSBGQU8tV0ZQIFNob2NrcywgQWdyaWN1bHR1cmFsIExpdmVsaWhvb2RzIGFuZCBGb29kIFNlY3VyaXR5IFN1cnZleSwgdGhlIEFybWVkIENvbmZsaWN0IExvY2F0aW9uIGFuZCBFdmVudCBEYXRhc2V0IChBQ0xFRCkgYW5kIHRoZSBNeWFubWFyIEluZm9ybWF0aW9uIE1hbmFnZW1lbnQgVW5pdCAoTUlNVSkuIA0KDQpUaGUgZmlyc3Qgc2VjdGlvbiBkZWFscyB3aXRoIHRoZSBkZXZlbG9wbWVudCBvZiBjb3JlIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBjcml0ZXJpYSB1c2luZyB0aGUgRkFPLVdGUCBzdXJ2ZXkgZGF0YS4gVGhlIHNlY29uZCBzZWN0aW9uIG1ha2VzIHVzZSBvZiBBQ0xFRCBkYXRhIGZvciBNeWFubWFyIHRvIGRldmVsb3AgYSBjb25mbGljdCBzY29yZSBmb3IgdG93bnNoaXAgcHJpb3JpdGlzYXRpb24uIFRvd25zaGlwIGFuZCBiZW5lZmljaWFyeSBzZWxlY3Rpb24gY3JpdGVyaWEgYXJlIGxpbmtlZCBieSBhIGRlY2lzaW9uIHRyZWUuIFRoZSB0aGlyZCBzZWN0aW9uIHByZXNlbnRzIGZsb29kIHJpc2tzIGJ5IHRvd25zaGlwIC0tIHRoZXNlIGFyZSBvbmx5IHByb2JhYmlsaXRpZXMgYW5kIHNlcnZlIGFzIHJlZmVyZW5jZXMgZm9yIHByZXBvc2l0aW9uaW5nIGFuZCBkaXNhc3RlciByaXNrIHJlZHVjdGlvbi4gVGhleSBub3QgaW5jbHVkZWQgaW4gdGhlIG92ZXJhbGwgcHJpb3JpdGlzYXRpb24gcHJvY2VzcywgdGhvdWdoIHRoaXMgbWlnaHQgY2hhbmdlIGlmIGRpc2FzdGVycyBvY2N1ci4gDQoNCjxicj4NCg0KIyMjIFJlZmVyZW5jZXMgZm9yIHRoaXMgcmVwb3J0DQoqIEFDTEVEICgyMDIyKS4gQUNMRUQgZGF0YSBmb3IgTXlhbm1hciAoMjAxMC0yMDIyKS4gaHR0cHM6Ly9hY2xlZGRhdGEuY29tLg0KKiBNYXJpYSBOb2VsIFBpIEFscGVyaW4sIFBoaWxpcHBlIFZhbiBLZXJtICgyMDA5KS4gbWRlcHJpdjogU3ludGhldGljIGluZGljYXRvcnMgb2YgbXVsdGlwbGUgZGVwcml2YXRpb24uIFN0YXRhIGNvbW1hbmQuIGh0dHA6Ly9tZWRpbS5jZXBzLmx1L3N0YXRhL21kZXByaXZfdjMucGRmDQoqIEF0aWxsaW8gQmVuaW5pLCBBbGRvIEJlbmluaSAoMjAyMSkuIG1kZXByaXY6IFN5bnRoZXRpYyBzY29yZXMgb2YgbXVsdGlwbGUgZGVwcml2YXRpb24uIFIgcGFja2FnZSB2ZXJzaW9uIDAuMC4zLiAgaHR0cHM6Ly9naXRodWIuY29tL2EtYmVuaW5pL21kZXByaXYvLg0KKiBHaWFubmkgQmV0dGksIFZpamF5IFZlcm1hICgyMDA0KS4gQSBtZXRob2RvbG9neSBmb3IgdGhlIHN0dWR5IG9mIG11bHRpLWRpbWVuc2lvbmFsIGFuZCBsb25naXR1ZGluYWwgYXNwZWN0cyBvZiBwb3ZlcnR5IGFuZCBkZXByaXZhdGlvbi4gRGlwYXJ0YW1lbnRvIGRpIE1ldG9kaSBRdWFudGl0YXRpdmksIFVuaXZlcnNpdGEgZGkgU2llbmEuIGh0dHA6Ly9yZXBlYy5kZXBzLnVuaXNpLml0L3F1YWRlcm5pLzQ5RE1RLnBkZi4gDQoqIEZBTyBhbmQgV0ZQICgyMDIyKS4gTXlhbm1hciB8IFNob2NrcywgYWdyaWN1bHR1cmFsIGxpdmVsaWhvb2RzIGFuZCBmb29kIHNlY3VyaXR5OiBNb25pdG9yaW5nIHJlcG9ydCwgTWFyY2ggMjAyMi4gUm9tZS4gDQoqIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciwgTXlhbm1hciAoMjAyMSkuIDVXcyByZXBvcnRpbmcgdG9vbC4NCiogRm9vZCBTZWN1cml0eSBDbHVzdGVyLCBNeWFubWFyICgyMDIyKS4gVW5kZXJzdGFuZGluZyBDb25mbGljdCBEeW5hbWljcyBpbiBNeWFubWFyIHRocm91Z2ggQ29uZmxpY3QgYW5kIEluY2lkZW50IERhdGE6IEEgRm9vZCBTZWN1cml0eSBQZXJzcGVjdGl2ZS4gaHR0cHM6Ly9mb29kLXNlY3VyaXR5LWNsdXN0ZXItbXlhbm1hci5naXRodWIuaW8vZXhwbG9yYXRvcnktZGF0YS1hbmFseXNpcy1hY2xlZC1mc2MvLg0KKiBIQVJQLUYgYW5kIE1JTVUgKDIwMTgpLiBWdWxuZXJhYmlsaXR5IGluIE15YW5tYXI6IEEgU2Vjb25kYXJ5IERhdGEgUmV2aWV3IG9mIE5lZWRzLCBDb3ZlcmFnZSBhbmQgR2Fwcy4gaHR0cDovL3RoZW1pbXUuaW5mby92dWxuZXJhYmlsaXR5LWluLW15YW5tYXIuDQoqIElGUFJJICgyMDIyKS4gSG91c2Vob2xkIFdlbGZhcmUgaW4gTXlhbm1hcjogUmVzdWx0cyBmcm9tIHRoZSBNeWFubWFyIEhvdXNlaG9sZCBXZWxmYXJlIFN1cnZleQ0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMS4gQmVuZWZpY2lhcnkgU2VsZWN0aW9uIHVzaW5nIEZBTy1XRlAgc3VydmV5IGRhdGENCg0KDQpBIHRvdGFsIG9mIGByIG5yb3coc3VydmV5KWAgaG91c2Vob2xkcyB3ZXJlIGludGVydmlld2VkIGluIHRoZSBGQU8tV0ZQIFNob2NrcywgQWdyaWN1bHR1cmFsIExpdmVsaWhvb2RzIGFuZCBGb29kIFNlY3VyaXR5IFN1cnZleSBpbiBBeWV5YXJ3YWR5LCBLYWNoaW4sIEtheWFoLCBLYXlpbiwgTW9uLCBSYWtoaW5lLCBTaGFuIGFuZCBZYW5nb24gdG8gbW9uaXRvciBmb29kIHNlY3VyaXR5IGFuZCBsaXZlbGlob29kcyBvZiBwZXJzb25zIGluIE15YW5tYXIuIFNvbWUgb2YgdGhlIG1vc3Qga2V5IGRhdGEgY29sbGVjdGVkIHdlcmUgb24gdGhlIHZhcmlvdXMgZm9vZCBzZWN1cml0eSBpbmRpY2VzIC0tIHRoZSBGb29kIENvbnN1bXB0aW9uIFNjb3JlIChGQ1MpLCB0aGUgRm9vZCBJbnNlY3VyaXR5IEV4cGVyaWVuY2UgU2NhbGUgKEZJRVMpIGFuZCB0aGUgTGl2ZWxpaG9vZCBDb3BpbmcgU3RyYXRlZ2llcyBJbmRleCAoQ1NJKS4gQWRkaXRpb25hbGx5LCBhIGNvbXBvc2l0ZSBvZiB0aGUgdGhyZWUgaW5kaWNlcywgdGhlIEZvb2QgU2VjdXJpdHkgU2NvcmUgaGFzIGFsc28gYmVlbiBjYWxjdWxhdGVkLiBJbmZvcm1hdGlvbiB3YXMgYWxzbyBjb2xsZWN0ZWQgb24gYmFzaWMgaG91c2Vob2xkIGRlbW9ncmFwaGljcyBhcyB3ZWxsIG9uIGluY29tZSBzb3VyY2VzLiBNdWNoIG1vcmUgZGV0YWlsIGNhbiBiZSBnbGVhbmVkIGZyb20gdGhlIHJlcG9ydCBpdHNlbGYgLS0gdGhpcyBkb2N1bWVudCBmb2N1c2VzIG9ubHkgb24gdGhlIGFzcGVjdHMgb2YgdGhlIHN1cnZleSB3aGljaCBjYW4gYmUgdXNlZCBmb3IgcHJpb3JpdGlzYXRpb24uDQoNCjxicj48YnI+DQoNCiMjIyAxLjEgQW4gb3ZlcnZpZXcgb2YgdGhlIGZvb2Qgc2VjdXJpdHkgaW5kaWNhdG9ycw0KDQpUaGUgcGxvdCBiZWxvdyByYW5rcyB2YXJpYWJsZXMgaW4gb3JkZXIgb2YgdGhlaXIgYWJpbGl0eSB0byBwcmVkaWN0IHRoZSB2YXJpb3VzIGZvb2QgaW5zZWN1cml0eSBjb21wb3NpdGUgaW5kaWNlcy4gT25seSBlbnZpcm9ubWVudGFsIG9yIGRlbW9ncmFwaGljIHZhcmlhYmxlcyB3ZXJlIHRha2VuIGludG8gYWNjb3VudCBhcyBpdCB3b3VsZCBiZSByZWR1bmRhbnQgdG8gcHJlZGljdCBmb29kIHNlY3VyaXR5IGluZGljZXMgdXNpbmcgdGhlIGNvbXBvbmVudHMgb2Ygc2FpZCBpbmRpY2VzLiBPbmx5IHJlc3BvbnNlcyB0aGF0IG9jY3VycmVkIG1vcmUgdGhhbiAyMDAgdGltZXMgKG91dCBvZiAyLDcwOCkgaW4gdGhlIHN1cnZleSB3ZXJlIGNvbnNpZGVyZWQuIA0KDQpWYXJpYWJsZXMgdGhhdCBhcmUgbW9yZSByZWQgYXJlIG1vc3QgbGlrZWx5IHRvIHJlc3VsdCBpbiBoaWdoIGZvb2QgaW5zZWN1cml0eSBzY29yZXMgKHRoYXQgaXMsIGhpZ2hlciBmb29kIGluc2VjdXJpdHkpIGFuZCB2YXJpYWJsZXMgdGhhdCBhcmUgbW9yZSBibHVlIGFyZSBtb3JlIGxpa2VseSB0byByZXN1bHQgaW4gbG93ZXIgZm9vZCBpbnNlY3VyaXR5IHNjb3Jlcy4gVGhlIGRvdHRlZCByZWQgbGluZSBkb3duIHRoZSBtaWRkbGUgYXQgJHg9MCQgc3BsaXRzIHZhcmlhYmxlcyBpbnRvIHdoZXRoZXIgdGhlIHByZWRpY3QgaGlnaGVyIGZvb2QgaW5zZWN1cml0eSAocG9zaXRpdmUgbnVtYmVycykgb3IgbG93ZXIgZm9vZCBpbnNlY3VyaXR5IChuZWdhdGl2ZSBudW1iZXJzKS4gDQoNCkZvciBhbGwgdGhlc2UgcGxvdHMsIHRoZSBzY29yZXMgb2YgdGhlIGZvb2Qgc2VjdXJpdHkgaW5kaWNlcyBoYXZlIGFsbCBiZWVuIHNjYWxlZCBiZXR3ZWVuIDAgYW5kIDEsIHdpdGggaGlnaGVyIHNjb3JlcyBpbmRpY2F0aW5nIGdyZWF0ZXIgZm9vZCBpbnNlY3VyaXR5Lg0KDQo8YnI+DQoNCmBgYHtyIGNvZWZmaWNpZW50LXBsb3QtcHJpb3JpdHksIGZpZy5oZWlnaHQ9OH0NCmxtX3ByZXBfbG9uZyA8LSBmdW5jdGlvbih0YmwpIHsNCiAgdGJsICU+JSANCiAgICBncm91cF9ieSh2YXIpICU+JSANCiAgbXV0YXRlKGNvdW50ID0gaWZlbHNlKHZhbHVlID4gMCwgMSwgMCksDQogICAgICAgICBjb3VudCA9IHN1bShjb3VudCwgbmEucm0gPSBUUlVFKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBmaWx0ZXIoY291bnQgPiAyMDApICU+JSAjIGFkanVzdCB0aGUgdGhyZXNob2xkIG4NCiAgc2VsZWN0KC1jb3VudCkgJT4lIA0KICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gdmFyLCB2YWx1ZXNfZnJvbSA9IHZhbHVlLCB2YWx1ZXNfZm4gPSBtYXgpICU+JSANCiAgc2VsZWN0KC1zdXJ2ZXlfaWQsIC1zaG9ja3Nfbm9uZSkNCn0NCg0KcGxvdF9jb2VmIDwtIGZ1bmN0aW9uKHRibCkgew0KICB0YmwgJT4lICANCiAgICB0aWR5KGNvbmYuaW50ID0gVFJVRSkgJT4lDQogICAgZmlsdGVyKHRlcm0gIT0gIihJbnRlcmNlcHQpIikgJT4lIA0KICAgIG11dGF0ZSh0ZXJtID0gc3RyX3JlcGxhY2UodGVybSwgImluY29tZV9tcyIsICJpbmNvbWVfc291cmNlIiksDQogICAgICAgICAgIHRlcm0gPSBzdHJfcmVwbGFjZSh0ZXJtLCAiaG9oX2FnZSIsICIiKSwNCiAgICAgICAgICAgdGVybSA9IHN0cl9yZXBsYWNlKHRlcm0sICJob2hfZWR1Y2F0aW9uIiwgIiIpLCANCiAgICAgICAgICAgdGVybSA9IGZjdF9yZW9yZGVyKHRlcm0sIGVzdGltYXRlKSkgJT4lIA0KICAgIGdncGxvdChhZXMoeCA9IGVzdGltYXRlLCB5ID0gdGVybSwgY29sb3VyID0gZXN0aW1hdGUpKSArIA0KICAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDAsIGx0eSA9IDIsIGNvbG91ciA9ICJyZWQiKSArDQogICAgZ2VvbV9wb2ludCgpICsgDQogICAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBjb25mLmxvdywgeG1heCA9IGNvbmYuaGlnaCksIGhlaWdodCA9IDAuMikgKw0KICAgIHNjYWxlX2NvbG91cl92aXJpZGlzKG9wdGlvbiA9ICJ0dXJibyIpICsNCiAgICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsDQogICAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDguNSksDQogICAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSA3LCBmYWNlID0gImJvbGQiKSwNCiAgICAgICAgICBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSA5KSkgKw0KICAgIGxhYnMoeCA9ICJFc3RpbWF0ZSIsIHkgPSAiIikNCn0NCg0Kc3VydmV5X2xvbmcgJT4lICANCiAgZmlsdGVyKHN0cl9kZXRlY3QodmFyLCAic2hvY2tzX3xob2hffHJ1cmFsfGV4cGVuc2VfZm9vZHxub3RfaW1wcm92ZWR8YWdyaV9hY3Rpdml0eXxpbmNvbWVfbXNffGVkdV8iKSB8DQogICAgICAgICAgIHZhciAlaW4lIGMoImZzX3Njb3JlMyIsICJleHBlbnNlX2Zvb2QiKSkgJT4lIA0KICBsbV9wcmVwX2xvbmcoKSAlPiUgDQogIG11dGF0ZShmc19zY29yZTMgPSBsb2coZnNfc2NvcmUzKSkgJT4lIA0KICBtdXRhdGUoZnNfc2NvcmUzID0gaWZlbHNlKGlzLmluZmluaXRlKGZzX3Njb3JlMyksIDAsIGZzX3Njb3JlMykpICU+JSANCiAgbG0oZnNfc2NvcmUzIH4gLiwgZGF0YSA9IC4pICU+JSANCiAgcGxvdF9jb2VmKCkgKyANCiAgbGFicyh0aXRsZSA9ICJGb29kIGluc2VjdXJpdHkgc2NvcmUiKSArIA0KICANCnN1cnZleV9sb25nICU+JQ0KICAgICAgICBmaWx0ZXIoc3RyX2RldGVjdCh2YXIsICJzaG9ja3NffGhvaF98cnVyYWx8ZXhwZW5zZV9mb29kfG5vdF9pbXByb3ZlZHxhZ3JpX2FjdGl2aXR5fGluY29tZV9tc198ZWR1XyIpIHwNCiAgICAgICAgIHZhciAlaW4lIGMoImNzaV93ZWlnaHRlZCIsICJleHBlbnNlX2Zvb2QiKSkgJT4lDQogIGxtX3ByZXBfbG9uZygpICU+JQ0KICBsbShjc2lfd2VpZ2h0ZWQgfiAuLCBkYXRhID0gLikgJT4lDQogIHBsb3RfY29lZigpICsgDQogIGxhYnModGl0bGUgPSAiQ29waW5nIHN0cmF0ZWdpZXMgaW5kZXgiKSArIA0KICANCnN1cnZleV9sb25nICU+JQ0KICBmaWx0ZXIoc3RyX2RldGVjdCh2YXIsICJzaG9ja3NffGhvaF98cnVyYWx8ZXhwZW5zZV9mb29kfG5vdF9pbXByb3ZlZHxhZ3JpX2FjdGl2aXR5fGluY29tZV9tc198ZWR1XyIpIHwNCiAgICAgICAgICAgdmFyICVpbiUgYygiaGhmY3NfaW52IiwgImV4cGVuc2VfZm9vZCIpKSAlPiUNCiAgbG1fcHJlcF9sb25nKCkgJT4lDQogIGxtKGhoZmNzX2ludiB+IC4sIGRhdGEgPSAuKSAlPiUNCiAgcGxvdF9jb2VmKCkgKyANCiAgbGFicyh0aXRsZSA9ICJGb29kIGNvbnN1bXB0aW9uIHNjb3JlIikgKyANCg0Kc3VydmV5X2xvbmcgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KHZhciwgInNob2Nrc198aG9oX3xydXJhbHxleHBlbnNlX2Zvb2R8bm90X2ltcHJvdmVkfGFncmlfYWN0aXZpdHl8aW5jb21lX21zX3xlZHVfIikgfA0KICAgICAgICAgICB2YXIgJWluJSBjKCJmaWVzX3Jhd19yYW5nZSIsICJleHBlbnNlX2Zvb2QiKSkgJT4lDQogIGxtX3ByZXBfbG9uZygpICU+JQ0KICBsbShmaWVzX3Jhd19yYW5nZSB+IC4sIGRhdGEgPSAuKSAlPiUNCiAgcGxvdF9jb2VmKCkgKyANCiAgbGFicyh0aXRsZSA9ICJGb29kIGluc2VjdXJpdHkgZXhwZXJpZW5jZSBzY2FsZSIpDQpgYGANCg0KPGJyPg0KDQpUaGUgcGxvdHMgYWJvdmUgcmFua3MgdmFyaWFibGVzIGluIG9yZGVyIG9mIHRoZWlyIGFiaWxpdHkgdG8gcHJlZGljdCB0aGUgdmFyaW91cyBmb29kIHNlY3VyaXR5IGNvbXBvc2l0ZSBpbmRpY2VzLiBWYXJpYWJsZXMgdGhhdCBhcmUgbW9yZSByZWQgYXJlIG1vcmUgbGlrZWx5IHRvIHJlc3VsdCBpbiBoaWdoIGZvb2QgaW5zZWN1cml0eSBzY29yZXMgYW5kIHZhcmlhYmxlcyB0aGF0IGFyZSBtb3JlIGJsdWUgYXJlIG1vcmUgbGlrZWx5IHRvIHJlc3VsdHMgaW4gbG93ZXIgZm9vZCBpbnNlY3VyaXR5IHNjb3Jlcy4gDQoNClRoZSB2YXJpYWJsZXMgdGhhdCBhcmUgdGhlIG1vc3QgaW1wb3J0YW50IGluIHByZWRpY3RpbmcgaGlnaCBmb29kIHNlY3VyaXR5IHNjb3JlcyBhcmUgYSBob3VzZWhvbGQncyBleHBvc3VyZSB0byBjb25mbGljdCwgd2hldGhlciBvciBub3QgdGhleSBsb3N0IGVtcGxveW1lbnQgb3Igd29yayBvcHBvcnR1bml0aWVzLCB3aGV0aGVyIG9yIG5vdCB0aGV5IHdlcmUgZW5nYWdlZCBpbiBjYXN1YWwgbm9uLWFncmljdWx0dXJhbCBsYWJvdXIgYW5kIHdoZXRoZXIgb3Igbm90IHRoZXkgcmVwb3J0ZWQgbm8gaW5jb21lIGluIHRoZSB0aHJlZSBtb250aHMgcHJpb3IgdG8gdGhlIHN1cnZleS4gDQoNClRoZXNlIHZhcmlhYmxlcyBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIHByZWxpbWluYXJ5IGxpc3Qgb2YgYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGNyaXRlcmlhIGZvciBmb29kIHNlY3VyaXR5IGFuZCBsaXZlbGlob29kcyBwcm9ncmFtbWluZy4gVGhpcyBsaXN0IGlzLCBvZiBjb3Vyc2UsIG5vbi1leGhhdXN0aXZlIGFzIGl0IG9ubHkgaW5jbHVkZXMgdmFyaWFibGVzIHRoYXQgd2VyZSBpbmNsdWRlZCBpbiB0aGUgRkFPLVdGUCBzdXJ2ZXkuIA0KDQpUaGUgdmFyaWFibGVzIHRoYXQgd2VyZSB0aGUgYmVzdCBwcmVkaWN0b3JzIG9mIGxvdyBmb29kIGluc2VjdXJpdHkgd2VyZSB3aGV0aGVyIG9yIG5vdCB0aGUgaGVhZCBvZiBob3VzZWhvbGQgaGFkIGNvbXBsZXRlZCBoaWdoZXIgZWR1Y2F0aW9uIGFuZCB3aGV0aGVyIG9yIG5vdCB0aGUgbWFpbiBpbmNvbWUgc291cmNlIG9mIHRoZSBob3VzZWhvbGQgd2FzIHN0YWJsZSBub24tYWdyaWN1bHR1cmFsIGVtcGxveW1lbnQuDQoNCjxicj48YnI+DQoNCiMjIyAxLjIgU2V0dGluZyBhIHRocmVzaG9sZCBmb3IgcHJpb3JpdGlzYXRpb24gDQoNCkFuIGltcG9ydGFudCBzdGVwIGlzIG5hcnJvd2luZyBkb3duIHRoZSBwb3B1bGF0aW9uIHRvIGEgcHJpb3JpdHkgZ3JvdXAgLS0gRm9vZCBTZWN1cml0eSBDbHVzdGVyIHBhcnRuZXJzIGRvIG5vdCBoYXZlIHRoZSByZXNvdXJjZXMgdG8gdGFyZ2V0IGFsbCBwZXJzb25zLg0KDQo+QSBob3VzZWhvbGQgd2FzIGNvbnNpZGVyZWQgdG8gYmUgYSBwcmlvcml0eSBmb3IgaW50ZXJ2ZW50aW9uIHdoZW4gdGhleSB3ZXJlIGFib3ZlIHRoZSA3NXRoIHBlcmNlbnRpbGUgaW4gYXQgbGVhc3QgdHdvIG91dCBvZiB0aGUgdGhyZWUgZm9vZCBzZWN1cml0eSBpbmRpY2VzIChmb29kIGNvbnN1bXB0aW9uIHNjb3JlLCBjb3Bpbmcgc3RyYXRlZ2llcyBpbmRleCBhbmQgZm9vZCBpbnNlY3VyaXR5IGV4cGVyaWVuY2Ugc2NhbGUpDQoNCkFwcHJveGltYXRlbHkgMzQlIG9mIHRoZSB0b3RhbCBwb3B1bGF0aW9uIGZhbGxzIGludG8gdGhpcyBwcmlvcml0eSBncm91cC4gVGhlIHBsb3QgYmVsb3cgc2hvd3MgdGhlIGZvb2Qgc2VjdXJpdHkgc3ViLWluZGljYXRvcnMgdGhhdCBhcmUgdGhlIG1vc3QgaW1wb3J0YW50IGluIGRldGVybWluaW5nIHdoZXRoZXIgYSBob3VzZWhvbGQgZmFsbHMgaW50byB0aGUgcHJpb3JpdHkgZ3JvdXAgb3Igbm90LiANCg0KVGhlIHBsb3RzIGJlbG93IHNob3dzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBhdmVyYWdlIHZhbHVlcyBvZiBmb29kIHNlY3VyaXR5IGluZGV4IGNvbXBvbmVudHMgYmFzZWQgb24gd2hldGhlciB0aGV5IGFyZSBwcmlvcml0eSBob3VzZWhvbGRzIG9yIG5vdC4gVmFyaWFibGVzIGluIGJsdWUgY29ycmVzcG9uZCB0byBDb3BpbmcgU3RyYXRlZ2llcyBJbmRleCBpbmRpY2F0b3JzLCB0aG9zZSBpbiByZWQgdG8gdGhlIEZvb2QgSW5zZWN1cml0eSBFeHBlcmllbmNlIFNjYWxlLiANCg0KVGhvc2UgaW4gZ3JlZW4gY29ycmVzcG9uZCB0byB0aGUgRm9vZCBDb25zdW1wdGlvbiBTY29yZSAtLSBmb3IgdGhlc2UgaW5kaWNhdG9ycywgdGhleSBoYXZlIGJlZW4gcmVzY2FsZWQgc28gdGhhdCBhIHZhbHVlIG9mIDEgc2hvd3MgdGhhdCBhIGhvdXNlaG9sZCBoYXMgbm90IGNvbnN1bWVkIHRoYXQgZm9vZCBncm91cCBhdCBhbGwgaW4gdGhlIHByZXZpb3VzIDcgZGF5cyBhbmQgYSB2YWx1ZSBvZiAwIHNob3dzIHRoYXQgdGhleSBoYXZlIGNvbnN1bWVkIHRoYXQgZm9vZCBncm91cCBldmVyeSBkYXkgZm9yIHRoZSBwYXN0IDcgZGF5cy4gDQoNCjxicj4NCg0KYGBge3IgZmFjZXQtcHJpb3JpdHktZ3JvdXAtY29tcGFyaXNvbn0NCnN1cnZleSAlPiUgc2VsZWN0KGNvbnRhaW5zKCJmaWVzIiksIGNvbnRhaW5zKCJmY3NfIiksIGNvbnRhaW5zKCJjc19lbWVyZ2VuY3kiKSwgY29udGFpbnMoImNzX2NyaXNpcyIpLCANCiAgICAgICAgICAgICAgICAgIHByaW9yaXR5KSAlPiUgDQogIHNlbGVjdCgtZmllc19yYXcsIC1maWVzX3Jhd19yYW5nZSwgLW5vdGVmY3NfLCAtaGhmY3NfaW52LCAtZmNzX2JvcmRlcmxpbmVfcG9vciwgLWNvbnRhaW5zKCJ3dCIpLCAtY29udGFpbnMoImhocyIpKSAlPiUNCiAgZHJvcF9uYSgpICU+JSANCiAgcGl2b3RfbG9uZ2VyKGNvbHMgPSAtcHJpb3JpdHksIG5hbWVzX3RvID0gInZhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgZ3JvdXBfYnkodmFyLCBwcmlvcml0eSkgJT4lIA0KICBzdW1tYXJpc2UobWVhbiA9IG1lYW4odmFsdWUpKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhtZWFuKSkgJT4lIA0KICBtdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oc3RyX2RldGVjdCh2YXIsICJmY3MiKSB+ICJmY3MiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdCh2YXIsICJjc18iKSB+ICJjc2kiLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9kZXRlY3QodmFyLCAiZmllcyIpIH4gImZpZXMiKSwNCiAgICAgICAgIHZhciA9IHJlb3JkZXJfd2l0aGluKHZhciwgYnkgPSBtZWFuLCB3aXRoaW4gPSBncm91cCksIA0KICAgICAgICAgcHJpb3JpdHkgPSByZWNvZGUocHJpb3JpdHksIGAwYCA9ICJub3RfcHJpb3JpdHkiLCBgMWAgPSAicHJpb3JpdHkiKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtZWFuLCB5ID0gcmVvcmRlcl93aXRoaW4odmFyLCBieSA9IG1lYW4sIHdpdGhpbiA9IGdyb3VwKSwgZmlsbCA9IGdyb3VwKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQocm91bmQobWVhbiwgZGlnaXRzID0gMikpKSwgc2l6ZSA9IDMsIGhqdXN0ID0gLTAuMSkgKyANCiAgbGFicyh4ID0gIk1lYW4iLCB5ID0gIiIsIHRpdGxlID0gIlByZXZhbGVuY2Ugb2YgZm9vZCBpbnNlY3VyaXR5IGluIHRoZSBzdXJ2ZXllZCBwb3B1bGF0aW9uIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLCANCiAgICAgICAgYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IDgsIGZhY2UgPSAiYm9sZCIpLCANCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSArDQogIGV4cGFuZF9saW1pdHMoeCA9IDEuMDUpICsNCiAgZmFjZXRfd3JhcCh+cHJpb3JpdHkpICsgDQogIHNjYWxlX3lfcmVvcmRlcmVkKCkNCmBgYA0KDQo8YnI+IA0KDQpXaGlsc3QgYm90aCBncm91cHMgdGVuZCB0byBjb25zdW1lIGxvdyBhbW91bnRzIG9mIGRhaXJ5LCBwdWxzZXMsIHN1Z2FyIGFuZCBmcnVpdHMsIHRoZXNlIHRyZW5kcyBhcmUgbXVjaCBtb3JlIHByb25vdW5jZWQgaW4gdGhlIHByaW9yaXR5IGdyb3VwLiBBZGRpdGlvbmFsbHksIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwIGFyZSBtb3JlIHRoYW4gdHdpY2UgYXMgbGlrZWx5IHRvIGhhdmUgcG9vciBwcm90ZWluIGNvbnN1bXB0aW9uLCBiZSB3b3JyaWVkIGFib3V0IG5vdCBoYXZpbmcgZW5vdWdoIGZvb2QgYW5kIGVhdCBsZXNzIGR1ZSB0byBhIGxhY2sgb2YgcmVzb3VyY2VzLiANCg0KSG91c2Vob2xkcyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAgd2VyZSBhbHNvIG1vcmUgdGhhbiBmb3VyIHRpbWVzIGFzIGxpa2VseSB0byBoYXZlIHJlZHVjZWQgaGVhbHRoY2FyZSBleHBlbmRpdHVyZXMsIGhhdmUgc29sZCBwcm9kdWN0aXZlIGFzc2V0cyBhbmQgYmUgdW5hYmxlIHRvIGVhdCBoZWFsdGh5IGFuZCBudXRyaXRpb3VzIGZvb2RzIGFuZCBlYXQgb25seSBhIGZldyBraW5kcyBvZiBmb29kcy4gVGhleSBhcmUgYWxzbyBtb3JlIHRoYW4gZml2ZSB0aW1lcyBhcyBsaWtlbHkgdG8gc2tpcHBlZCBtZWFscyBvciBnb25lIGh1bmdyeS4gDQoNCjxicj48YnI+DQoNCiMjIyAxLjMgRGVjaXNpb24gdHJlZQ0KDQpgYGB7ciBkZi10cmVlLXJ1bGVzfQ0KDQp0cmVlNCA8LSBzdXJ2ZXkgJT4lIA0KICBycGFydChwcmlvcml0eSB+ICBzaG9ja3NfbG9zdHdvcmsgKyBzaG9ja3Nfc2lja25lc3NkZWF0aCArIHNob2Nrc19mb29kcHJpY2VzICsgc2hvY2tzX2NvbmZsaWN0ICsgc2hvY2tzX2NhbnR3b3JrYnVzaW5lc3MgKw0KICAgICAgICAgIHNob2Nrc19uYXR1cmFsaGF6YXJkICsgc2hvY2tzX2FjY2Vzc21hcmtldCArIHNob2Nrc19wcmljZXNvdGhlciArIHNob2Nrc19vdGhlciArIA0KICAgICAgICAgIGhvaF9mZW1hbGUgKyBydXJhbCArIG5vdF9pbXByb3ZlZF9zYW5pdGF0aW9uLA0KICAgICAgICBkYXRhID0gLiwgIHdlaWdodHMgPSBjb21iaW5lZF93dCAsIGNwID0gMC4wMSkNCg0Kc3VydmV5IDwtIHN1cnZleSAlPiUgDQogIG11dGF0ZShydWxlNCA9IHJvdy5uYW1lcyh0cmVlNCRmcmFtZSlbdHJlZTQkd2hlcmVdKSAlPiUgDQogIGxlZnRfam9pbihycGFydC5ydWxlcy50YWJsZSh0cmVlNCkgJT4lIA0KICAgICAgICAgICAgICBmaWx0ZXIoTGVhZiA9PSBUUlVFKSAlPiUgDQogICAgICAgICAgICAgIHJlbmFtZShydWxlNCA9IFJ1bGUpICU+JSANCiAgICAgICAgICAgICAgZ3JvdXBfYnkocnVsZTQpICU+JSANCiAgICAgICAgICAgICAgc3VtbWFyaXNlKHN1YnJ1bGVzNCA9IHBhc3RlKFN1YnJ1bGUsIGNvbGxhcHNlID0gIiwiKSksIGJ5ID0gInJ1bGU0IikgDQoNCmBgYA0KDQoNCkhvd2V2ZXIgbGFyZ2UgdGhlIGRpZmZlcmVuY2VzIGFyZSBiZXR3ZWVuIHRoZSBmb29kIHNlY3VyaXR5IHN0YXR1c2VzIG9mIHRob3NlIGluIHRoZSBwcmlvcml0eSBncm91cCBhbmQgdGhvc2Ugb3V0c2lkZSBvZiBpdCwgbWFueSBvZiB0aGVzZSBpbmRpY2F0b3JzIGFyZSBub3QgZWFzaWx5IG9ic2VydmFibGUuIEl0IHdvdWxkIGJlIGV4dHJlbWVseSBjaGFsbGVuZ2luZyB0byBjb25kdWN0IGEgbGFyZ2Utc2NhbGUgY29tcHJlaGVuc2l2ZSBmb29kIHNlY3VyaXR5IHN1cnZleSBwcmlvciB0byBiZW5lZmljaWFyeSBzZWxlY3Rpb24uICANCg0KVGhpcyBuZWNlc3NpdGF0ZXMgdGhlIGNyZWF0aW9uIG9mIHNpbXBsZSB0b29sIHRvIGFpZCBpbiBwcmlvcml0aXNhdGlvbi4gQSBzaW1wbGUgdHJlZSBoYXMgYmVlbiBkZXZlbG9wZWQsIGNvbnNpZGVyaW5nIG9ubHkgdGhlIHZhcmlhYmxlcyBpbiB0aGUgRkFPLVdGUCBzdXJ2ZXkgdGhhdCBhcmUgZWFzaWx5IG9ic2VydmFibGUuIFRoZSB0cmVlIGJlbG93IHRha2VzIGludG8gYWNjb3VudCBvbmx5IHRocmVlIHZhcmlhYmxlcyAtLSB3aGV0aGVyIG9yIG5vdCBhIGhvdXNlaG9sZCBpcyBpbiBhIHJ1cmFsIGFyZWEsIHdoZXRoZXIgb3Igbm90IHRoZXkgaGF2ZSBleHBlcmllbmNlZCB2aW9sZW5jZSwgaW5zZWN1cml0eSBvciBjb25mbGljdCBpbiB0aGUgcGFzdCB0aHJlZSBtb250aHMgYW5kIHdoZXRoZXIgb3Igbm90IHRoZXkgaGF2ZSBsb3N0IHdvcmsgb3IgZW1wbG95bWVudCBvcHBvcnR1bml0aWVzIGluIHRoZSBwYXN0IHRocmVlIG1vbnRocy4gDQoNCldpdGhpbiBlYWNoIGJsdWUgc3F1YXJlLCB0aGUgZmlndXJlIGluICoqYm9sZCoqIHNob3cgdGhlICoqcGVyY2VudGFnZSBvZiBlYWNoIGdyb3VwIHRoYXQgYXJlIHByaW9yaXR5IGhvdXNlaG9sZHMqKiBhbmQgdGhlIGZpZ3VyZXMgaW4gKml0YWxpY3MqIHNob3cgdGhlICpwZXJjZW50YWdlIG9mIHRoZSBvdmVyYWxsIHBvcHVsYXRpb24qIGluIGVhY2ggbm9kZS4gDQoNCjxicj4NCg0KKipEZWNpc2lvbiB0cmVlKioNCiFbXShkZWNpc2lvbl90cmVlLnBuZykNCjxicj4NCg0KVGhlIHBlcmNlbnRhZ2Ugb2YgcHJpb3JpdHkgaG91c2Vob2xkcyBpbiBydXJhbCBhcmVhcyBpcyBtdWNoIGhpZ2hlciB0aGFuIGluIHVyYmFuIG9uZXMgKDM3LjYlIHZzIDI2LjElKS4gRm9yIHJ1cmFsIGFyZWFzLCB0aGUgaW5kaWNhdG9yIHRoYXQgYmVzdCBkaXN0aW5ndWlzaGVzIHByaW9yaXR5IGhvdXNlaG9sZHMgaXMgd2hldGhlciBvciB0aGV5IGhhdmUgZGlyZWN0bHkgZXhwZXJpZW5jZWQgdmlvbGVuY2UsIGluc2VjdXJpdHkgb3IgY29uZmxpY3QgaW4gdGhlIHBhc3QgdGhyZWUgbW9udGhzLiBUaGUgZmFjdG9yIHRoYXQgYmVzdCBkaXN0aW5ndWlzaGVzIHByaW9yaXR5IGhvdXNlaG9sZHMgaW4gdXJiYW4gYXJlYXMgaXMgd2hldGhlciBvciBub3QgdGhleSBoYXZlIGxvc3Qgd29yayBvciBlbXBsb3ltZW50IG9wcG9ydHVuaXRpZXMgaW4gdGhlIHBhc3QgdGhyZWUgbW9udGhzLiAgDQoNClRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgZGVjaXNpb24gdHJlZSBpcyBub3QgZXhhY3RseSBzcGVjdGFjdWxhciAtLSBpZiBhIHBhcnRuZXIgd2FudGVkIHRvIHRhcmdldCBhbiBlbnRpcmUgY29tbXVuaXR5LCB0aGUgdGhyZXNob2xkIGZvciBibGFua2V0IGNvdmVyYWdlIHdvdWxkIGJlIGFyb3VuZCA3NSUgb3IgODAlIGJlaW5nIGluIHRoZSBwcmlvcml0eSBncm91cC4gQnV0IHRoZSBkZWNpc2lvbiB0cmVlIGlzIHZlcnkgc2ltcGxlIGFuZCB1bmRlcnN0YW5kYWJsZSAodGhlIGxhc3Qgc2VjdGlvbiBvbiB0ZWNobmljYWwgbm90ZXMgZXhwbGFpbnMgd2h5IGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgd2FzIG5vdCBlbXBsb3llZCBoZXJlKS4gQWRkaXRpb25hbCBiZW5lZmljaWFyeSBzZWxlY3Rpb24gY3JpdGVyaWEgd2lsbCBiZSBuZWNlc3NhcnksIGJ1dCB0aGlzIGRlY2lzaW9uIHRyZWUgZG9lcyBhdCBsZWFzdCBnaXZlIHNvbWUgZGlyZWN0aW9uIGZvciBnZW9ncmFwaGljIHByaW9yaXRpc2F0aW9uLCB3aGljaCBpcyBkaXNjdXNzZWQgaW4gdGhlIG5leHQgc2VjdGlvbi4gDQoNCkFzIGEgbm90ZSwgdGhlc2UgZmluZGluZ3MgYXJlIGNvbnNpc3RlbnQgd2l0aCBJRlBSSSdzIHN1cnZleSBvbiBob3VzZWhvbGQgd2VsZmFyZSB3aGVyZSBydXJhbCBob3VzZWhvbGRzIHdlcmUgZm91bmQgdG8gYmUgbW9yZSBhc3NldC1wb29yIGFuZCBsZXNzIHJlc2lsaWVudCB0aGFuIHVyYmFuIG9uZXMuIEhvd2V2ZXIsIG11Y2ggbW9yZSB3b3JrIHJlbWFpbnMgdG8gYmUgZG9uZSBvbiB0cmlhbmd1bGF0aW5nIHRoZSBGQU8tV0ZQIHN1cnZleSB3aXRoIHRoZSBJRlBSSSBvbmUsIHdoaWNoIHdhcyBtdWNoIG1vcmUgY29tcHJlaGVuc2l2ZSBpbiBzY29wZSBhbmQgc2NhbGUuIA0KDQo8YnI+PGJyPg0KDQojIyMgMS40IEV4Y2VwdGlvbnMgZm9yIHRhcmdldGluZyBhZ3JpY3VsdHVyYWwgaG91c2Vob2xkcw0KDQo2NC43JSBvZiB0aGUgdG90YWwgcG9wdWxhdGlvbiBpcyBpbiB0aGUgdHJlZSBub2RlICpbNl0qICh0aGUgbm9kZXMgYXJlIGFsbCBudW1iZXJlZCBpbiB0aGUgZGVjaXNpb24gdHJlZSBhYm92ZSkgLS0gd2l0aGluIHRoaXMgZ3JvdXAgYXJlIGhvdXNlaG9sZHMgd2hvIHJlc2lkZSBpbiBydXJhbCBhcmVhcyBidXQgaGF2ZSBub3QgYmVlbiBhZmZlY3RlZCBieSB2aW9sZW5jZSwgY29uZmxpY3Qgb3IgaW5zZWN1cml0eS4gR2l2ZW4gdGhhdCB0aGlzIGlzIGEgc2lnbmlmaWNhbnQgY2h1bmsgb2YgdGhlIHBvcHVsYXRpb24gd2hlcmUsIHdpdGggcmVmZXJlbmNlIHRvIHRoZSBwbG90IGJlbG93LCA3OCUgb2YgdGhlIHBvcHVsYXRpb24gaXMgaW52b2x2ZWQgaW4gYWdyaWN1bHR1cmUsIGFuIGV4Y2VwdGlvbiBjYW4gYmUgbWFkZSBpbiB0aGlzIG9uZSBpbnN0YW5jZSwgdG8gc3VwcG9ydCBwYXJ0bmVycyB3aG8gd2FudCB0byB0YXJnZXQgYWdyaWN1bHR1cmFsIGhvdXNlaG9sZHMgd2hvIGhhdmUgbm90IGJlZW4gYWZmZWN0ZWQgYnkgdGhlIGNvbmZsaWN0LiAgDQoNCkl0IG11c3Qgc3RpbGwgYmUgbWVudGlvbmVkIHRoYXQgYWlkIGZsb3cgZmlyc3QgdG8gdGhlIGhvdXNlaG9sZHMgaW4gbm9kZSAqWzddKiwgd2hlcmUgdGhlIHByb3BvcnRpb24gb2YgaG91c2Vob2xkcyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAgaXMgaGlnaGVzdC4gT25seSBhZnRlciB0aGUgbmVlZHMgb2YgdGhpcyBwb3B1bGF0aW9uIGFyZSBtZXQgc2hvdWxkIGhvdXNlaG9sZHMgaW4gbm9kZSAqWzZdKiBiZSB0YXJnZXRlZC4gDQoNCjxicj4NCg0KYGBge3IgYmFycGxvdC1wYy1hZ3JpfQ0Kc3VydmV5ICU+JSANCiAgbXV0YXRlKGFncmlfaGhkID0gYWdyaV9oaGQgKiBjb21iaW5lZF93dCkgJT4lIA0KICBncm91cF9ieShydWxlNCkgJT4lIA0KICBzdW1tYXJpc2Uoc3VtID0gc3VtKGFncmlfaGhkKSwgDQogICAgICAgICAgICBjb21iaW5lZF93dCA9IHN1bShjb21iaW5lZF93dCkpICU+JSANCiAgbXV0YXRlKHBjX2FnID0gc3VtIC8gY29tYmluZWRfd3QsIA0KICAgICAgICAgcGMgPSBjb21iaW5lZF93dCAvIHN1bShjb21iaW5lZF93dCkpICU+JSANCiAgbXV0YXRlKHJ1bGU0ID0gZmN0X3JldihydWxlNCkpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gcGMsIHkgPSBydWxlNCwgZmlsbCA9IHBjX2FnKSkgKyANCiAgZ2VvbV9jb2woKSArDQogIGdlb21fdGV4dChhZXMobGFiZWwgPSBzY2FsZXM6OnBlcmNlbnQocm91bmQocGNfYWcsIGRpZ2l0cyA9IDMpKSksDQogICAgICAgICAgICBoanVzdCA9IC0wLjEpICsgDQogIHNjYWxlX2ZpbGxfdmlyaWRpcyhvcHRpb24gPSAibWFrbyIsIGRpcmVjdGlvbiA9IC0xLCBiZWdpbiA9IDAuMTUpICsgICANCiAgc2NhbGVfeF9jb250aW51b3VzKGxhYmVscyA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgbGFicyh4ID0gIlBlcmNlbnQgb2YgdG90YWwgcG9wdWxhdGlvbiIsIA0KICAgICAgIHkgPSAiVHJlZSBub2RlIiwNCiAgICAgICB0aXRsZSA9ICJTaGFyZSBvZiBhZ3JpY3VsdHVyYWwgaG91c2Vob2xkcyBieSB0cmVlIG5vZGUiLCANCiAgICAgICBmaWxsID0gIiUgYWdyaVxuaGhkIikgKyANCiAgdGhlbWUoYXhpcy50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDEyKSkgKyANCiAgZXhwYW5kX2xpbWl0cyh4ID0gLjY4KQ0KYGBgDQoNCjxicj4gDQoNClRoZSB0cmVlIGJlbG93IGNhcnJpZXMgb24gZnJvbSBub2RlICpbNl0qIG9mIHRoZSBtYWluIGRlY2lzaW9uIHRyZWUgaW4gdGhlIHNlY3Rpb24gYWJvdmUuIFdpdGhpbiB0aGlzIGdyb3VwIG9mIHJ1cmFsIGhvdXNlaG9sZHMgbm90IGFmZmVjdGVkIGJ5IGNvbmZsaWN0ICg2NC43JSBvZiB0aGUgdG90YWwgcG9wdWxhdGlvbiksIGlkZW50aWZ5aW5nIGhvdXNlaG9sZHMgd2hvIGhhdmUgbG9zdCBhY2Nlc3MgdG8gbWFya2V0cyBkdWUgdG8gY29uZmxpY3QsIGluZnJhc3RydWN0dXJlIGRhbWFnZSBvciBvdGhlciBhY2Nlc3MgaXNzdWVzIGFuZCBob3VzZWhvbGRzIHdobyBoYXZlIGJlZW4gYWZmZWN0ZWQgYnkgbmF0dXJhbCBoYXphcmRzICh0aGUgbW9zdCBjb21tb24gb2Ygd2hpY2ggaXMgZmxvb2RpbmcpIGltcHJvdmVzIHRoZSBjaGFuY2VzIG9mIHRhcmdldGluZyBob3VzZWhvbGRzIGluIHRoZSBwcmlvcml0eSBncm91cCB0byBzbGlnaHRseSBhYm92ZSA1MCUuIA0KDQpBbnkgZnVydGhlciBjb25kaXRpb25zIGFwcGxpZWQgb24gdGhlIHRyZWUgb25seSByZXN1bHQgaW4gZXh0cmVtZWx5IG1hcmdpbmFsIGdhaW5zLiANCg0KPGJyPg0KDQoqKkRlY2lzaW9uIHRyZWUgLS0gZnJvbSB0cmVlIG5vZGUgWzZdKioNCiFbXShhZ3JpY3VsdHVyYWxfZXhjZXB0aW9uLnBuZykNCg0KPGJyPg0KDQpJdCBpcyBwZXJoYXBzIGJlc3QgdG8gdGFyZ2V0IHByaW9yaXR5IGhvdXNlaG9sZHMgaW4gdGhlc2UgYXJlYXMgYnkgZXN0YWJsaXNoaW5nIGNsZWFyIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBjcml0ZXJpYS4gVGhlIHBsb3QgYmVsb3cgc2hvd3MgdGhlIGJlc3QgcHJlZGljdG9ycyBvZiBmb29kIGluc2VjdXJpdHkgd2l0aGluIHRoZSBob3VzZWhvbGRzIGluIG5vZGUgKls2XSouIA0KDQpUaGUgdmFyaWFibGVzIHdpdGhpbiB0aGUgRkFPLVdGUCBzdXJ2ZXkgbW9zdCBvZiB1c2UgdG8gcGFydG5lcnMgdGFyZ2V0aW5nIHByaW9yaXR5IGhvdXNlaG9sZHMgaW4gbm9kZSAqWzZdKiBhcmUgd2hldGhlciBvciBub3QgYSBob3VzZWhvbGQgaGFzIGltcHJvdmVkIHNhbml0YXRpb24gYW5kIHRoZSBlZHVjYXRpb25hbCBhdHRhaW5tZW50IG9mIHRoZSBoZWFkIG9mIHRoZSBob3VzZWhvbGQuIFRoZSBtb3N0IGltcG9ydGFudCBzaG9ja3MgZm9yIHRoaXMgZ3JvdXAgd2VyZSBuYXR1cmFsIGhhemFyZHMgYW5kIHRoZSBsb3NzIG9mIHdvcmsgb3IgZW1wbG95bWVudCBvcHBvcnR1bml0aWVzLiBUaGVzZSB2YXJpYWJsZXMgY29uc3RpdHV0ZSBzZXZlcmFsIGNvcmUgY3JpdGVyaWEgZm8gYmVuZWZpY2lhcnkgc2VsZWN0aW9uIGZvciBydXJhbCBob3VzZWhvbGRzIHRoYXQgaGF2ZSBub3QgYmVlbiBhZmZlY3RlZCBieSBjb25mbGljdC4NCg0KPGJyPg0KDQpgYGB7ciBjb2VmLXBsb3Qtbm9kZTZ9DQpzdXJ2ZXkgJT4lIGZpbHRlcihydWxlNCA9PSA2KSAlPiUgDQogIHNlbGVjdChjb250YWlucygic2hvY2tzXyIpLCBub3RfaW1wcm92ZWRfc2FuaXRhdGlvbiwgY29udGFpbnMoImluY29tZV9tc18iKSwNCiAgICAgICAgIGhvaF9lZHVjYXRpb24sIGhvaF9mZW1hbGUsIGhvaF9hZ2UsIGZzX3Njb3JlMikgJT4lIA0KICBzZWxlY3QoLWMoc2hvY2tzX2NvbmZsaWN0LCBpbmNvbWVfbXNfZmlzaGVyaWVzKSkgJT4lIA0KICBtdXRhdGUoZnNfc2NvcmUyID0gbG9nKGZzX3Njb3JlMikpICU+JSANCiAgbXV0YXRlKGZzX3Njb3JlMiA9IGlmZWxzZShpcy5pbmZpbml0ZShmc19zY29yZTIpLCAwLCBmc19zY29yZTIpKSAlPiUgDQogIGxtKGZzX3Njb3JlMiB+IC4sIGRhdGEgPSAuKSAlPiUgDQogICAgdGlkeShjb25mLmludCA9IFRSVUUpICU+JQ0KICAgIGZpbHRlcih0ZXJtICE9ICIoSW50ZXJjZXB0KSIpICU+JSANCiAgICBtdXRhdGUodGVybSA9IHN0cl9yZXBsYWNlKHRlcm0sICJpbmNvbWVfbXMiLCAiaW5jb21lX3NvdXJjZSIpLA0KICAgICAgICAgICB0ZXJtID0gc3RyX3JlcGxhY2UodGVybSwgImhvaF9hZ2UiLCAiIiksDQogICAgICAgICAgIHRlcm0gPSBzdHJfcmVwbGFjZSh0ZXJtLCAiaG9oX2VkdWNhdGlvbiIsICIiKSwgDQogICAgICAgICAgIHRlcm0gPSBmY3RfcmVvcmRlcih0ZXJtLCBlc3RpbWF0ZSkpICU+JSANCiAgICBnZ3Bsb3QoYWVzKHggPSBlc3RpbWF0ZSwgeSA9IHRlcm0sIGNvbG91ciA9IGVzdGltYXRlKSkgKyANCiAgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwLCBsdHkgPSAyLCBjb2xvdXIgPSAicmVkIikgKw0KICAgIGdlb21fcG9pbnQoKSArIA0KICAgIGdlb21fZXJyb3JiYXJoKGFlcyh4bWluID0gY29uZi5sb3csIHhtYXggPSBjb25mLmhpZ2gpLCBoZWlnaHQgPSAwLjIpICsNCiAgICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAidHVyYm8iKSArDQogICAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiLA0KICAgICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSA4LjUpLA0KICAgICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gNywgZmFjZSA9ICJib2xkIikpICsNCiAgICBsYWJzKHggPSAiRXN0aW1hdGUiLCB5ID0gIiIsIA0KICAgICAgICAgdGl0bGUgPSAiQ29lZmZpY2llbnQgcGxvdCBmb3IgaG91c2Vob2xkcyBpbiB0cmVlIG5vZGUgWzZdIikNCg0KYGBgDQoNCg0KPGJyPjxicj4NCg0KIyMjIDEuNSBJbXBhY3Qgb2YgY29uZmxpY3Qgb24gZm9vZCBzZWN1cml0eQ0KDQpDb25mbGljdCBoYXMgYSByZWFsLCB0aG91Z2ggc29tZXRpbWVzIGxpbWl0ZWQgaW1wYWN0IG9uIGZvb2Qgc2VjdXJpdHkuIFRob3VnaCB0aGUgRkFPLVdGUCBzdXJ2ZXkgd2FzIG5vdCBkZXZlbG9wZWQgd2l0aCBtZWFzdXJpbmcgdGhlIGltcGFjdCBvZiBjb25mbGljdCBpbiBtaW5kLCBpdCBpcyBuZXZlcnRoZWxlc3MgcG9zc2libGUgdG8gY29udHJvbCBmb3Igc29tZSBmYWN0b3JzIGFuZCBleGFtaW5lIHRoZSBpbXBhY3Qgb2YgY29uZmxpY3Qgb24gc2V2ZXJhbCBncm91cHMuIA0KDQpUaGUgcGxvdCBiZWxvdyBzaG93cyB0aGUgaW1wYWN0IG9uIHRoZSBvdmVyYWxsIGZvb2QgaW5zZWN1cml0eSBzY29yZXMgYmFzZWQgb24gd2hldGhlciBhIGhvdXNlaG9sZCBoYXMgYmVlbiBpbXBhY3RlZCBieSBjb25mbGljdCBvciBub3QuIFdlIGhhdmUgc2VsZWN0ZWQgdGhlIHR3byBsYXJnZXN0IGdyb3VwcyB3aXRoaW4gdGhlIHJ1cmFsIGFuZCB1cmJhbiBjb250ZXh0IChmYXJtZXJzIGFuZCB3b3JrZXJzIGVtcGxveWVkIGluIHN0YWJsZSwgbm9uLWFncmljdWx0dXJhbCBlbXBsb3ltZW50KSBhbmQgaGF2ZSBzcGxpdCB0aGVzZSBwb3B1bGF0aW9ucyBieSBlZHVjYXRpb24gbGV2ZWwuIA0KDQo8YnI+DQoNCmBgYHtyIGZhY2V0LWNvbmZsaWN0LWltcGFjdH0NCmNvbmZfaW1wYWN0IDwtIGZ1bmN0aW9uKHRibCkgew0KICB0YmwgJT4lIA0KICAgIGdyb3VwX2J5KGhvaF9lZHVjYXRpb24sIHNob2Nrc19jb25mbGljdCkgJT4lIA0KICAgIGZpbHRlcighaXMubmEoaG9oX2VkdWNhdGlvbiksDQogICAgICAgICAgIGhvaF9lZHVjYXRpb24gIT0gImVkdV9yZWxpZ2lvdXMiKSAlPiUgDQogICAgc3VtbWFyaXNlKG1lYW5fc2NvcmUgPSBtZWFuKGZzX3Njb3JlMikpICU+JSANCiAgICB1bmdyb3VwKCkgJT4lIA0KICAgIG11dGF0ZShzaG9ja3NfY29uZmxpY3QgPSByZWNvZGUoc2hvY2tzX2NvbmZsaWN0LCBgMGAgPSAibm8iLCBgMWAgPSAieWVzIiksDQogICAgICAgICAgIHNob2Nrc19jb25mbGljdCA9IGZjdF9yZXYoc2hvY2tzX2NvbmZsaWN0KSwNCiAgICAgICAgICAgaG9oX2VkdWNhdGlvbiA9IGZjdF9yZWxldmVsKGhvaF9lZHVjYXRpb24sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjKCJlZHVfbm9uZSIsICJlZHVfcHJpbWFyeSIsICJlZHVfc2Vjb25kYXJ5IiwgImVkdV9oaWdoZXIiKSkpDQp9DQogIA0Kc3VydmV5ICU+JSANCiAgZmlsdGVyKGluY29tZV9tc19zdGFibGVfbm9uX2FnID09IDEgJiBydXJhbCA9PSAwKSAlPiUNCiAgY29uZl9pbXBhY3QoKSAlPiUgDQogIG11dGF0ZShjYXRlZ29yeSA9ICJ1cmJhbl93b3JrZXJzIikgJT4lIA0KICByYmluZCgNCiAgICBzdXJ2ZXkgJT4lIA0KICAgICAgZmlsdGVyKGluY29tZV9tc19hZ3JpY3VsdHVyZSA9PSAxICYgcnVyYWwgPT0gMSkgJT4lIA0KICAgICAgY29uZl9pbXBhY3QoKSAlPiUgDQogICAgICBtdXRhdGUoY2F0ZWdvcnkgPSAicnVyYWxfZmFybWVycyIpDQogICkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSBtZWFuX3Njb3JlLCB5ID0gaG9oX2VkdWNhdGlvbiwgZmlsbCA9IHNob2Nrc19jb25mbGljdCkpICsgDQogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsID0gcm91bmQobWVhbl9zY29yZSwgMykpLCANCiAgICAgICAgICAgIHNpemUgPSAzLjUsIGhqdXN0ID0gLTAuMSwgDQogICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSkgKw0KICBsYWJzKHggPSAiTWVhbiBmb29kIGluc2VjdXJpdHkgc2NvcmUiLCB5ID0gIkVkdWNhdGlvbiBsZXZlbCwgaG91c2Vob2xkIGhlYWQiLA0KICAgICAgIGZpbGwgPSAic2hvY2s6XG5jb25mbGljdCIsDQogICAgICAgdGl0bGUgPSAiSW1wYWN0IG9mIGNvbmZsaWN0IG9uIGZvb2QgaW5zZWN1cml0eSIsDQogICAgICAgc3VidGl0bGUgPSAiSGlnaGVyIHNjb3JlcyBpbmRpY2F0ZSBoaWdoZXIgZm9vZCBpbnNlY3VyaXR5IikgKw0KICBleHBhbmRfbGltaXRzKHggPSAwLjE2KSArDQogIGZhY2V0X3dyYXAofiBjYXRlZ29yeSkNCmBgYA0KDQo8YnI+DQoNClRoZSBmb29kIGluc2VjdXJpdHkgc2NvcmVzIG9mIGFsbCBncm91cHMgZXhjZXB0IG9uZSBhcmUgaGlnaGVyIHdoZW4gYSBob3VzZWhvbGQgaGFzIGV4cGVyaWVuY2VkIGNvbmZsaWN0LiBUaGlzIGJ5IG5vIG1lYW5zIGNvbnN0aXR1dGVzIGEgc2NpZW50aWZpYyBwcm9vZiAoYW5vdGhlciBzdXJ2ZXkgd291bGQgaGF2ZSB0byBiZSBjb25kdWN0ZWQpLCBidXQgaXQgaXMgcG9zc2libGUgdG8gc3RhdGUgd2l0aCBzb21lIGNvbmZpZGVuY2UgdGhhdCBleHBvc3VyZSB0byBjb25mbGljdCBoYXMgYSBuZWdhdGl2ZSBpbXBhY3Qgb24gZm9vZCBzZWN1cml0eS4gVGhlIHNtYWxsIHNhbXBsZSBzaXplIGxpa2VseSByZXN1bHRzIGluIHdpZGVseSBkaXZlcmdpbmcgdmFsdWVzIGluIHNvbWUgY2FzZXM7IGFkZGl0aW9uYWxseSB0aGUgcHVycG9zZSBvZiB0aGUgRkFPLVdGUCBzdXJ2ZXkgd2FzIG5vdCB0byB1bmRlcnN0YW5kIGNvbmZsaWN0IGR5bmFtaWNzLiANCg0KVGhlIHBsb3QgYmVsb3cgaXMgZnVydGhlciBleGFtaW5hdGlvbiBvZiB0aGUgaW1wYWN0IG9mIGNvbmZsaWN0IG9uIGZvb2Qgc2VjdXJpdHkuIFRoZSBlc3RpbWF0ZXMgaW4gdGhlIHBsb3QgYmVsb3cgc2hvdyB0aGUgaW1wYWN0IG9mIGV4cG9zdXJlIHRvIGNvbmZsaWN0IG9uIHRoZSB2YXJpb3VzIGZvb2Qgc2VjdXJpdHkgaW5kaWNlcy4gVGhlIGZvb2Qgc2VjdXJpdHkgaW5kaWNlcyB1c2VkIHdlcmUgcmUtc2NhbGVkIGJldHdlZW4gMCBhbmQgMSwgd2l0aCBoaWdoZXIgc2NvcmVzIGluZGljYXRpbmcgZ3JlYXRlciBmb29kIGluc2VjdXJpdHkuIA0KDQpOb3RhYmx5LCB0aGUgZWZmZWN0IG9mIGNvbmZsaWN0IHdhcyBtb3N0IHByb25vdW5jZWQgaW4gdGhlIEZvb2QgSW5zZWN1cml0eSBFeHBlcmllbmNlIFNjb3JlcyBvZiBydXJhbCBob3VzZWhvbGRzIC0tIGV4cG9zdXJlIHRvIGNvbmZsaWN0IGluIHRoZXNlIGhvdXNlaG9sZHMgd2FzIGxpbmtlZCB3aXRoIGEgMC4xMiBpbmNyZWFzZSBpbiBzY29yZSwgd2hpY2ggaXMgc3Vic3RhbnRpYWwuIEFsbCB0aGUgZWZmZWN0cyB3ZXJlIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGNvbmZsaWN0IG9uIEZvb2QgQ29uc3VtcHRpb24gU2NvcmVzIGluIHVyYmFuIGNvbnRleHRzICh0aGF0IHBvaW50IGlzIG1hcmtlZCBieSBhIHRyaWFuZ2xlIGluIHRoZSBwbG90IGJlbG93IHRvIGRlbm90ZSB0aGlzKS4gDQoNCjxicj4NCg0KDQpgYGB7ciBlc3RpbWF0ZS1wbG90LWZzLWluZGljZXN9DQoNCmNvbl9lc3QgPC0gZnVuY3Rpb24odGJsLCB5LCB4LCB6KXsNCiAgDQogIHkgPC0gZW5xdW8oeSkNCiAgeCA8LSBlbnF1byh4KQ0KICB6IDwtIGVucXVvKHopDQogIA0KICBtb2RlbF9mb3JtdWxhIDwtIGZvcm11bGEocGFzdGUwKHF1b19uYW1lKHkpLCAifiIsIHF1b19uYW1lKHgpKSkNCiAgDQogIGxtKG1vZGVsX2Zvcm11bGEsIGRhdGEgPSB0YmwpICU+JSANCiAgICB0aWR5KGNvbmYuaW50ID0gVFJVRSkgJT4lIA0KICAgIGZpbHRlcih0ZXJtICE9ICIoSW50ZXJjZXB0KSIpICU+JSANCiAgICBtdXRhdGUobW9kZWwgPSBwYXN0ZTAocXVvX25hbWUoeSksICJfIiwgcXVvX25hbWUoeikpKQ0KfQ0KDQpyYmluZCgNCnN1cnZleSAlPiUgDQogIGZpbHRlcihydXJhbCA9PSAxKSAlPiUgDQogIGNvbl9lc3QoaGhmY3NfaW52LCBzaG9ja3NfY29uZmxpY3QsIHJ1cmFsKSwgDQpzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocnVyYWwgPT0gMSkgJT4lIA0KICBjb25fZXN0KGZpZXNfcmF3X3JhbmdlLCBzaG9ja3NfY29uZmxpY3QsIHJ1cmFsKSwNCnN1cnZleSAlPiUgIA0KICBmaWx0ZXIocnVyYWwgPT0gMSkgJT4lIA0KICBjb25fZXN0KGNzaV93ZWlnaHRlZCwgc2hvY2tzX2NvbmZsaWN0LCBydXJhbCksDQpzdXJ2ZXkgJT4lIA0KICBmaWx0ZXIocnVyYWwgPT0gMCkgJT4lIA0KICBjb25fZXN0KGhoZmNzX2ludiwgc2hvY2tzX2NvbmZsaWN0LCB1cmJhbiksIA0Kc3VydmV5ICU+JSANCiAgZmlsdGVyKHJ1cmFsID09IDApICU+JSANCiAgY29uX2VzdChmaWVzX3Jhd19yYW5nZSwgc2hvY2tzX2NvbmZsaWN0LCB1cmJhbiksDQpzdXJ2ZXkgJT4lICANCiAgZmlsdGVyKHJ1cmFsID09IDApICU+JSANCiAgY29uX2VzdChjc2lfd2VpZ2h0ZWQsIHNob2Nrc19jb25mbGljdCwgdXJiYW4pDQopICU+JSANCiAgbXV0YXRlKHNpZ25pZmljYW50ID0gaWZlbHNlKHAudmFsdWUgPD0gMC4wNSwgMSwgMCksDQogICAgICAgICBtb2RlbCA9IHJlY29kZShtb2RlbCwgImhoZmNzX2ludl9ydXJhbCIgPSAiRkNTX3J1cmFsIiwgImhoZmNzX2ludl91cmJhbiIgPSAiRkNTX3VyYmFuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJmaWVzX3Jhd19yYW5nZV9ydXJhbCIgPSAiRklFU19ydXJhbCIsICJmaWVzX3Jhd19yYW5nZV91cmJhbiIgPSAiRklFU191cmJhbiIsICANCiAgICAgICAgICAgICAgICAgICAgICAgICJjc2lfd2VpZ2h0ZWRfcnVyYWwiID0gIkNTSV9ydXJhbCIsICJjc2lfd2VpZ2h0ZWRfdXJiYW4iID0gIkNTSV91cmJhbiIpLA0KICAgICAgICAgbW9kZWwgPSBmY3RfcmVvcmRlcihtb2RlbCwgZXN0aW1hdGUpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IGVzdGltYXRlLCB5ID0gbW9kZWwsIGNvbG91ciA9IGVzdGltYXRlKSkgKyANCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCwgbHR5ID0gMiwgY29sb3VyID0gInJlZCIpICsgDQogIGdlb21fcG9pbnQoYWVzKHBjaCA9IGZjdF9yZXYoZmFjdG9yKHNpZ25pZmljYW50KSkpLCBzaXplID0gMikgKyANCiAgZ2VvbV9lcnJvcmJhcmgoYWVzKHhtaW4gPSBjb25mLmxvdywgeG1heCA9IGNvbmYuaGlnaCksIGhlaWdodCA9IDAuMikgKyANCiAgc2NhbGVfY29sb3VyX3ZpcmlkaXMob3B0aW9uID0gInR1cmJvIikgKyANCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIA0KICBsYWJzKHggPSAiRXN0aW1hdGUiLCB5ID0gIiIsIA0KICAgICAgIHRpdGxlID0gIkVmZmVjdCBvZiBjb25mbGljdCBvbiBmb29kIHNlY3VyaXR5IGluZGljZXMiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJTcGxpdCBieSBydXJhbC91cmJhbiBjb250ZXh0cyIpIA0KICANCmBgYA0KDQo8YnI+DQoNCkluIHRoZSBuZXh0IHNlY3Rpb24sIGNvbmZsaWN0IHNjb3JlcyB3aWxsIGJlIHVzZWQgdG8gcHJpb3JpdGlzZSBiZXR3ZWVuIHRvd25zaGlwcy4NCg0KDQo8YnI+PGJyPjxicj4NCg0KIyMgMi4gRGlzdHJpYnV0aW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBpbiBNeWFubWFyDQoNCkFwcHJveGltYXRlbHkgNiUgb2YgYWxsIHRoZSBob3VzZWhvbGRzIHN1cnZleWVkIGJ5IEZBTy1XRlAgd2VyZSBkaXJlY3RseSBhZmZlY3RlZCBieSBjb25mbGljdCwgdmlvbGVuY2UgYW5kIGluc2VjdXJpdHkuIFRoaXMgZGlzY291bnRzIGhvdXNlaG9sZHMgdGhhdCBoYXZlIGJlZW4gYWZmZWN0ZWQgYnkgdGhlIHNlY29uZGFyeSBpbXBhY3RzIG9mIGNvbmZsaWN0LCBzdWNoIGFzIGxvc3Mgb2YgYWNjZXNzIHRvIG1hcmtldHMgYW5kIGluY3JlYXNlZCBmb29kIHByaWNlcy4gV2hpbHN0IHRoZXJlIGlzIG5vIHNldCB0aHJlc2hvbGQgd2hlcmVieSBvbmUgY2FuIHN0YXRlIHRoYXQgZXZlcnlvbmUgaW4gYSBnaXZlbiBhcmVhIGhhcyBiZWVuIGFmZmVjdGVkIGJ5IGNvbmZsaWN0LCBpdCBpcyBwb3NzaWJsZSB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIGNvbmZsaWN0IGhhcyBiZWVuIHRoZSBtb3N0IHNldmVyZS4NCg0KU2ltaWxhciB0byBob3cgdGhlIGJhc2ljIGNyaXRlcmlhIGJlbmVmaWNpYXJ5IHNlbGVjdGlvbiBhdCB0aGUgaG91c2Vob2xkIGxldmVsIHdhcyBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gYWJvdmUsIHRoaXMgc2VjdGlvbiB3aWxsIGZvY3VzIG9uIGhvdyB0byBwcmlvcml0aXNlIGFtb25nc3QgdGhlIHZhcmlvdXMgZ2VvZ3JhcGhpYyBhcmVhcyBpbiBNeWFubWFyLiBGb3IgYSBtb3JlIGNvbXByZWhlbnNpdmUgcmV2aWV3IG9mIGNvbmZsaWN0IGluIE15YW5tYXIsIHBsZWFzZSByZWZlciB0byB0aGUgRm9vZCBTZWN1cml0eSBDbHVzdGVyJ3MgcmVwb3J0IFtVbmRlcnN0YW5kaW5nIENvbmZsaWN0IER5bmFtaWNzIGluIE15YW5tYXIgdGhyb3VnaCBDb25mbGljdCBhbmQgSW5jaWRlbnQgRGF0YTogQSBGb29kIFNlY3VyaXR5IFBlcnNwZWN0aXZlXShodHRwczovL2Zvb2Qtc2VjdXJpdHktY2x1c3Rlci1teWFubWFyLmdpdGh1Yi5pby9leHBsb3JhdG9yeS1kYXRhLWFuYWx5c2lzLWFjbGVkLWZzYy8pLiANCg0KPGJyPjxicj4NCg0KIyMjIDIuMSBDb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgc3RhdGUvcmVnaW9uDQoNCmBgYHtyIGNvbmZpY3Qtc3RhdGUtYmFycGxvdH0NCmNvbmZsaWN0X3Njb3JlICU+JSANCiAgc2VsZWN0KGFkbWluM19wY29kZSwgYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHByb3Rlc3RzX2FuZF9yaW90cywgDQogICAgICAgICBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzLCB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucykgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoYmF0dGxlczp2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucyksIG5hbWVzX3RvID0gImV2ZW50X3R5cGUiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUgDQogIGxlZnRfam9pbihmc19waW4gJT4lIHNlbGVjdChhZG1pbjNfcGNvZGUsIHN0YXRlKSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBncm91cF9ieShzdGF0ZSkgJT4lIA0KICBtdXRhdGUodG90YWxfZXZlbnRzID0gc3VtKHZhbHVlKSkgJT4lIA0KICB1bmdyb3VwKCkgJT4lIA0KICBtdXRhdGUoc3RhdGUgPSBmY3RfcmVvcmRlcihzdGF0ZSwgLXRvdGFsX2V2ZW50cykpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc3RhdGUsIHkgPSB2YWx1ZSwgZmlsbCA9IGV2ZW50X3R5cGUpKSArIA0KICBnZW9tX2NvbCgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIHZqdXN0ID0gMC43LCBoanVzdCA9IDAuNyksIA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnMoeCA9ICIiLCANCiAgICAgICB5ID0gIkNvbmZsaWN0IGV2ZW50cyIsDQogICAgICAgdGl0bGUgPSAiMjAyMSBjb25mbGljdCBldmVudHMgYnkgc3RhdGUiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIikNCg0KI2dnc2F2ZSgiZXZlbnRfdHlwZV9zdGF0ZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCjxicj4NCg0KU2FnYWluZyBzYXcgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmZsaWN0IGV2ZW50cyBhcyB3ZWxsIGFzIGNvbmZsaWN0IGFzIHdlbGwgYXMgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzIGluIDIwMTIuIEl0IGV4cGVyaWVuY2VkIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBhcyBtYW55IGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyB0aGFuIHRoZSBuZXh0LWhpZ2hlc3Qgc3RhdGUvcmVnaW9uIC0tIE1hZ3dheS4gVGhpcyBpcyBhIHNpZ25pZmljYW50IHNoaWZ0IGluIHRoZSBwYXR0ZXJuIG9mIGNvbmZsaWN0IGluIE15YW5tYXIsIHdoaWNoIGhhcyB0cmFkaXRpb25hbGx5IHJldm9sdmVkIGFyb3VuZCBLYWNoaW4sIFJha2hpbmUgYW5kIFNoYW4uIA0KDQpLYXlhaCwgQ2hpbiBhbmQgU2FnYWluZyBoYWQgdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIGNvbmZsaWN0IGZhdGFsaXRpZXMgcGVyIGNhcGl0YSBpbiAyMDIxLiANCg0KPGJyPg0KDQpgYGB7ciBjb25mbGljdC1mYXRhbGl0aWVzLWJhcnBsb3R9DQoNCmNvbmZsaWN0X3Njb3JlICU+JSANCiAgc2VsZWN0KGFkbWluM19wY29kZSwgZmF0YWxpdGllcykgJT4lIA0KICBsZWZ0X2pvaW4oZnNfcGluICU+JSBzZWxlY3QoYWRtaW4zX3Bjb2RlLCBzdGF0ZSwgcG9wdWxhdGlvbl8yMDIxX3Byb2opLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGdyb3VwX2J5KHN0YXRlKSAlPiUgDQogIHN1bW1hcmlzZShmYXRhbGl0aWVzID0gc3VtKGZhdGFsaXRpZXMpLCANCiAgICAgICAgICAgIHBvcCA9IHN1bShwb3B1bGF0aW9uXzIwMjFfcHJvaikpICU+JSANCiAgbXV0YXRlKGZhdGFsaXRpZXNfcGMgPSBmYXRhbGl0aWVzIC8gcG9wKSAlPiUgDQogIG11dGF0ZShzdGF0ZSA9IGZjdF9yZW9yZGVyKHN0YXRlLCAtZmF0YWxpdGllcykpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gc3RhdGUsIHkgPSBmYXRhbGl0aWVzLCBmaWxsID0gZmF0YWxpdGllc19wYykpICsNCiAgZ2VvbV9jb2woKSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gIm1hZ21hIiwgZGlyZWN0aW9uID0gLTEpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKGxhYmVscyA9IGNvbW1hKSArDQogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAsIHZqdXN0ID0gMC43LCBoanVzdCA9IDAuNyksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh4ID0gIiIsDQogICAgICAgeSA9ICJOdW1iZXIgb2YgZmF0YWxpdGllcyIsIA0KICAgICAgIHRpdGxlID0gIkNvbmZsaWN0IGZhdGFsaXRpZXMgYnkgc3RhdGUiLA0KICAgICAgIHN1YnRpdGxlID0iYW5kIGZhdGFsaXRpZXMgcGVyIGNhcGl0YSIsIA0KICAgICAgIGZpbGwgPSAiZmF0YWxpdGllc1xucGVyIGNhcGl0YSIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjbGVkZGF0YS5jb20iKQ0KDQojIGdnc2F2ZSgiZmF0YWxpdGllc19zdGF0ZS5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KICANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMi4yIENvbmZsaWN0IHNjb3JlIGJ5IHRvd25zaGlwDQoNCkFzIGNhbiBiZSBzZWVtIGZyb20gdGhlIGJhcnBsb3RzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCB0aGUgZGlzdHJpYnV0aW9uIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBpcyBub3QgZXZlbiwgYmVpbmcgc2tld2VkIHRvIGEgZmV3IHN0YXRlcy9yZWdpb25zLiBUaGlzIGlzIGFsc28gZXZpZGVudCBhdCB0b3duc2hpcCBsZXZlbC4gSW4gdGhlIHNjYXR0ZXJwbG90IGJlbG93LCB0aGUgYXZlcmFnZXMgb2YgdGhlIG51bWJlciBvZiBjb25mbGljdCBldmVudHMgYW5kIHRoZSBudW1iZXIgb2YgZmF0YWxpdGllcyBhdCB0aGUgdG93bnNoaXAgbGV2ZWwgaGF2ZSBiZWVuIG1hcmtlZCBieSB0aGUgZG90dGVkIHJlZCBsaW5lcywgZGl2aWRpbmcgdGhlIHBsb3QgaW50byBmb3VyIHF1YWRyYW50cy4gDQoNCkEgcmVxdWlzaXRlIGZvciBhbnkgcHJpb3JpdGlzYXRpb24gc2NvcmUgb3IgaW5kZXggZGV2ZWxvcCBzaG91bGQgYmUgdGFyZ2V0LCBmaXJzdCBhbmQgZm9yZW1vc3QsIHRoZSB0b3duc2hpcHMgaW4gdGhlIHVwcGVyIHJpZ2h0IHF1YWRyYW50IG9mIHRoZSBwbG90LCB3aGljaCBoYXZlIHRoZSBoZWF2aWVzdCBjb25jZW50cmF0aW9ucyBvZiBjb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMuIFRoZXNlIGFyZWFzIGFyZSB3aGVyZSwgYXMgd2UgaGF2ZSBlc3RhYmxpc2hlZCBpbiB0aGUgc2VjdGlvbiBvbiBiZW5lZmljaWFyeSBzZWxlY3Rpb24sIHdoZXJlIHRoZSBoaWdoZXN0IGNvbmNlbnRyYXRpb25zIG9mIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwIHdpbGwgYmUgZm91bmQuIEZvciByZWZlcmVuY2UsIDU4IHRvd25zaGlwcyBoYXZlIGJvdGggYWJvdmUtYXZlcmFnZSBudW1iZXJzIG9mIGNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyAodXBwZXItcmlnaHQgcXVhZHJhbnQpIGFuZCAxOTYgdG93bnNoaXBzIGhhdmUgYm90aCBiZWxvdy1hdmVyYWdlIG51bWJlcnMgb2YgY29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIChib3R0b20tbGVmdCBxdWFkcmFudCkuIA0KDQo8YnI+DQoNCmBgYHtyIGNvbmZsaWN0LXNjYXR0ZXJwbG90fQ0KY29uZmxpY3Rfc2NhdHRlciA8LSBjb25mbGljdF9zY29yZSAlPiUgDQogIG11dGF0ZSh0b3RhbF9ldmVudHMgPSBiYXR0bGVzICsgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgKyBwcm90ZXN0c19hbmRfcmlvdHMgKyBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzICsNCiAgICAgICAgICAgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpICU+JSANCiAgbGVmdF9qb2luKGZzX3BpbiAlPiUgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgcGFydG5lcnNfMjAyMSwgYWRtaW4zX3Bjb2RlLCBwb3B1bGF0aW9uX2RlbnNpdHkpLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIGdncGxvdChhZXMoeSA9IGZhdGFsaXRpZXMsIHggPSB0b3RhbF9ldmVudHMsIGNvbG91ciA9IHRvdGFsX2V2ZW50cywgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHM6ICIsIHRvdGFsX2V2ZW50cywgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhdGFsaXRpZXM6ICIsIGZhdGFsaXRpZXMsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0bmVyczogIiwgcGFydG5lcnNfMjAyMSkpKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBmYXRhbGl0aWVzKSwgYWxwaGEgPSAwLjg1KSArDQogIHNjYWxlX3lfY29udGludW91cyh0cmFucyA9ICJsb2cxMCIsIGJyZWFrcyA9IGMoMCwgMSwgMTAsIDMwLCAxMDAsIDMwMCwgMTAwMCkpICsNCiAgc2NhbGVfeF9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAxMCwgMzAsIDEwMCwgMzAwKSkgKw0KICBzY2FsZV9jb2xvdXJfdmlyaWRpcyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWVhbihmYXRhbGl0aWVzKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKHRvdGFsX2V2ZW50cykpLCBjb2xvdXIgPSAicmVkIiwgbHR5ID0gMikgKw0KICBsYWJzKHggPSAiQ29uZmxpY3QgZXZlbnRzIiwgDQogICAgICAgeSA9ICJGYXRhbGl0aWVzIiwNCiAgICAgICB0aXRsZSA9ICJDb25mbGljdCBldmVudHMgYW5kIGZhdGFsaXRpZXMgYnkgdG93bnNoaXAiLCANCiAgICAgICBzdWJ0aXRsZSA9ICJNZWFucyBvZiBib3RoIGF4ZXMgYXJlIG1hcmtlZCBieSB0aGUgZG90dGVkIHJlZCBsaW5lIiwNCiAgICAgICBjb2xvdXIgPSAiY29uZmxpY3RcbmV2ZW50cyIsIA0KICAgICAgIHNpemUgPSAiZmF0YWxpdGllcyIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjbGVkZGF0YS5jb20iKSANCg0KZ2dwbG90bHkoY29uZmxpY3Rfc2NhdHRlciwgdG9vbHRpcCA9IGMoInRleHQiKSkgJT4lIA0KICAjIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UsIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDYpKSkgJT4lIA0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBieSB0b3duc2hpcCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHM7IG1lYW5zIG1hcmtlZCBieSByZWQgbGluZXM7IGZhdGFsaXRpZXMgbWFya2VkIGJ5IHNpemUiLCI8L3N1cD4iKSkpDQoNCiMgZ2dzYXZlKCJ0c3Bfc2NhdHRlcl9jb25mbGljdC5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KDQpgYGANCg0KPGJyPg0KDQpBdCBpdHMgbW9zdCBiYXNpYywgdGhlIGNvbmZsaWN0IHNjb3JlIGlzIGp1c3QgdGhlIGF2ZXJhZ2Ugb2YgYmF0dGxlcywgZXhwbG9zaW9ucywgcmVtb3RlIHZpb2xlbmNlLCB2aW9sZW5jZSBhZ2FpbnN0IGNpdmlsaWFucywgc3RyYXRlZ2ljIGRldmVsb3BtZW50cywgbm9uLXBlYWNlZnVsIHByb3Rlc3RzIGFuZCByaW90cyBhbmQgY29uZmxpY3QtcmVsYXRlZCBmYXRhbGl0aWVzLiBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGluIHRoZSBGU0M7cyByZXBvcnQgW1VuZGVyc3RhbmRpbmcgQ29uZmxpY3QgRHluYW1pY3MgaW4gTXlhbm1hciB0aHJvdWdoIENvbmZsaWN0IGFuZCBJbmNpZGVudCBEYXRhOiBBIEZvb2QgU2VjdXJpdHkgUGVyc3BlY3RpdmVdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjLykuIFRoaXMgc2NvcmUgd2lsbCBiZSBub3cgYmUgdXNlZCBhcyBhIHNob3J0aGFuZCBmb3IgY29uZmxpY3QgaW5jaWRlbmNlIGluIE15YW5tYXIuDQoNCkl0IGlzIGFkZGl0aW9uYWxseSByZWNvZ25pc2VkIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHRvd25zaGlwcyBuZWNlc3NpdGF0ZSBkaWZmZXJlbnQgcHJvZ3JhbW1pbmcgb3B0aW9ucy4gQW5kLCBhcyBlc3RhYmxpc2hlZCBpbiB0aGUgZmlyc3Qgc2VjdGlvbiwgcnVyYWwgYW5kIHVyYmFuIGFyZWFzIGhhdmUgd2lkZWx5IGRpZmZlcmluZyBudW1iZXJzIG9mIGhvdXNlaG9sZHMgaW4gdGhlIHByaW9yaXR5IGdyb3VwLiBUaGVyZWZvcmUsIHRvd25zaGlwcyBoYWNlIGFsc28gc3BsaXQgaW50byBmb3VyIHNpbXBsZSBncm91cHMgKEExLCBBMiwgQjEgYW5kIEIyKSBiYXNlZCBvbiB0aGVpciBjb25mbGljdCBzY29yZSBhbmQgcG9wdWxhdGlvbiBkZW5zaXR5LiANCg0KVGhpcyBncm91cGluZyBzZXBhcmF0ZXMgYWxsIDMzMCB0b3duc2hpcHMgYWxvbmcgdHdvIGNyaXRlcmlhIC0tIGhpZ2ggKEEpIG9yIGxvdyAoQikgY29uZmxpY3Qgc2NvcmUgYW5kIGhpZ2ggKDEpIG9yIGxvdyAoMikgcG9wdWxhdGlvbiBkZW5zaXR5LiBHcm91cHMgQTEgYW5kIEEyIGhhdmUgYWJvdmUgYXZlcmFnZSBjb25mbGljdCBzY29yZXMuIFRoZXNlIDEwNyB0b3duc2hpcHMgc2hvdWxkIGJlIHByaW9yaXRpc2VkIGZvciBodW1hbml0YXJpYW4gaW50ZXJ2ZW50aW9ucy4gUmVjYWxsaW5nIHRoZSBzY2F0dGVycGxvdCBhYm92ZSwgdGhlIGNvbG91cnMgaGF2ZSBub3cgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIHByaW9yaXRpc2F0aW9uIGdyb3VwLiBGcm9tIHRoZSBwbG90IGJlbG93IHRoYXQgd2hpbHN0IGdyb3VwIEExIGhhdmUgcG9wdWxhdGlvbnMgdGhhdCBhcmUgZWFzaWVyIHRvIGFjY2VzcyAoaGF2aW5nIGhpZ2hlciBwb3B1bGF0aW9uIGRlbnNpdHkpLCB0aGUgaW5jaWRlbmNlIG9mIGNvbmZsaWN0IGlzIGhpZ2hlciBvdmVyYWxsIGluIGdyb3VwIEEyLCB3aXRoIHRoZSBudW1iZXJzIG9mIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcyBiZWluZyBtdWNoIGhpZ2hlci4gVGhpcyBxdWljay1hbmQtZGlydHkgcHJpb3JpdGlzYXRpb24gaGFzIG1hbmFnZWQgdG8gZXhjbHVkZSBhbG1vc3QgYWxsIHRoZSB0b3duc2hpcHMgaW4gYm90dG9tLWxlZnQgcXVhZHJhbnQgKGxlYXN0IGNvbmZsaWN0LWFmZmVjdGVkKSBmcm9tIGdyb3VwcyBBMSBhbmQgQTIuIA0KDQo8YnI+DQoNCg0KYGBge3Igc2NhdHRlcnBsb3QtZ3JvdXBzfQ0Kc2NhdHRlcl9ncm91cHMgPC0gZnNfcGluICU+JSANCiAgbXV0YXRlKHRvdGFsX2V2ZW50cyA9IGJhdHRsZXMgKyBleHBsb3Npb25zX3JlbW90ZV92aW9sZW5jZSArIHByb3Rlc3RzX2FuZF9yaW90cyArIHN0cmF0ZWdpY19kZXZlbG9wbWVudHMgKw0KICAgICAgICAgICB2aW9sZW5jZV9hZ2FpbnN0X2NpdmlsaWFucykgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB0b3RhbF9ldmVudHMsIHkgPSBmYXRhbGl0aWVzLCBjb2xvdXIgPSBncm91cCwgDQogICAgICAgICAgICAgdGV4dCA9IHBhc3RlMCh0b3duc2hpcCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cDogIiwgZ3JvdXAsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJldmVudHM6ICIsIHRvdGFsX2V2ZW50cywgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhdGFsaXRpZXM6ICIsIGZhdGFsaXRpZXMsICIsIiwgIlxuIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJ0bmVyczogIiwgcGFydG5lcnNfMjAyMSkpKSArDQogIGdlb21fcG9pbnQoYWVzKHNpemUgPSBmYXRhbGl0aWVzKSwgYWxwaGEgPSAwLjgpICsNCiAgc2NhbGVfeV9jb250aW51b3VzKHRyYW5zID0gImxvZzEwIiwgYnJlYWtzID0gYygwLCAxLCAxMCwgMzAsIDEwMCwgMzAwLCAxMDAwKSkgKw0KICBzY2FsZV94X2NvbnRpbnVvdXModHJhbnMgPSAibG9nMTAiLCBicmVha3MgPSBjKDAsIDEsIDEwLCAzMCwgMTAwLCAzMDApKSArDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiIzU3NUM2REZGIiwgIiMwMDIwNERGRiIsICIjQzRCNTZDRkYiLCAiI0ZGRUE0NkZGIikpICsNCiAgIyBzY2FsZV9jb2xvdXJfdmlyaWRpc19kKG9wdGlvbiA9ICJjaXZpZGlzIikgKw0KICBnZW9tX2hsaW5lKGFlcyh5aW50ZXJjZXB0ID0gbWVhbihmYXRhbGl0aWVzLCBuYS5ybSA9IFRSVUUpKSwgY29sb3VyID0gInJlZCIsIGx0eSA9IDIpICsNCiAgZ2VvbV92bGluZShhZXMoeGludGVyY2VwdCA9IG1lYW4odG90YWxfZXZlbnRzLCBuYS5ybSA9IFRSVUUpKSwgY29sb3VyID0gInJlZCIsIGx0eSA9IDIpICsNCiAgbGFicyh4ID0gIkNvbmZsaWN0IGV2ZW50cyIsIA0KICAgICAgIHkgPSAiRmF0YWxpdGllcyIsDQogICAgICAgdGl0bGUgPSAiQ29uZmxpY3QgZXZlbnRzIGFuZCBmYXRhbGl0aWVzIGJ5IHByaW9yaXRpc2F0aW9uIGdyb3VwIiwgDQogICAgICAgc3VidGl0bGUgPSAiTWVhbnMgb2YgYm90aCBheGVzIGFyZSBtYXJrZWQgYnkgdGhlIGRvdHRlZCByZWQgbGluZSIsDQogICAgICAgY29sb3VyID0gImdyb3VwIiwgDQogICAgICAgc2l6ZSA9ICJmYXRhbGl0aWVzIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIpIA0KDQpnZ3Bsb3RseShzY2F0dGVyX2dyb3VwcywgdG9vbHRpcCA9IGMoInRleHQiKSkgJT4lIA0KICAjIGxheW91dChzaG93bGVnZW5kID0gRkFMU0UsIGxlZ2VuZCA9IGxpc3QoZm9udCA9IGxpc3Qoc2l6ZSA9IDYpKSkgJT4lIA0KICBjb25maWcoZGlzcGxheU1vZGVCYXIgPSBGQUxTRSkgJT4lIA0KICBsYXlvdXQodGl0bGUgPSBsaXN0KHRleHQgPSBwYXN0ZTAoIkNvbmZsaWN0IGV2ZW50cyBhbmQgZmF0YWxpdGllcyBieSBwcmlvcml0aXNhdGlvbiBncm91cCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHM7IG1lYW5zIG1hcmtlZCBieSByZWQgbGluZXM7IGZhdGFsaXRpZXMgbWFya2VkIGJ5IHNpemUiLCI8L3N1cD4iKSkpDQoNCmBgYA0KDQo8YnI+DQoNCkdyb3VwcyBBMSBhbmQgQTIgY2FuIGJlIGRpc3Rpbmd1aXNoZWQgYnkgdGhlaXIgcG9wdWxhdGlvbiBkZW5zaXR5LCB3aXRoIHRoZSBhdmVyYWdlIHBvcHVsYXRpb24gZGVuc2l0eSBpbiBncm91cCBBMSBiZWluZyBtb3JlIHRoYW4gMTAwIHRpbWVzIGhpZ2hlciB0aGFuIGluIGdyb3VwIEEyLiBUaGUgYXZlcmFnZSBQSU4gcGVyIHRvd25zaGlwIGlzIHNsaWdodGx5IGhpZ2hlciBpbiBncm91cCBBMSB0aGFuIGluIGdyb3VwIEEyLiBUaGUgc2NhdHRlcnBsb3QgYmVsb3cgc2hvd3MgdG93bnNoaXBzIGJ5IHRoZSBudW1iZXIgb2YgcGVvcGxlIGluIG5lZWQgKHgtYXhpcykgYW5kIHRoZSBwb3B1bGF0aW9uIGRlbnNpdHkgKHktYXhpcyksIHdpdGggdGhlIGNvbG91cnMgcmVmbGVjdGluZyB3aGljaCBncm91cCBlYWNoIGJlbG9uZ3MgdG86DQoNCjxicj4NCg0KDQpgYGB7cn0NCnBvcF9zY2F0dGVyIDwtIGZzX3BpbiAlPiUgDQogIG11dGF0ZSh0b3RhbF9ldmVudHMgPSBiYXR0bGVzICsgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UgKyBwcm90ZXN0c19hbmRfcmlvdHMgKyBzdHJhdGVnaWNfZGV2ZWxvcG1lbnRzICsNCiAgICAgICAgICAgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMpICU+JSANCiAgZ2dwbG90KGFlcyh4ID0gZnNfcGluLCB5ID0gcG9wdWxhdGlvbl9kZW5zaXR5LCBjb2xvdXIgPSBncm91cCwNCiAgICAgICAgICAgICB0ZXh0ID0gcGFzdGUwKHRvd25zaGlwLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwOiAiLCBncm91cCwgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50czogIiwgdG90YWxfZXZlbnRzLCAiLCIsICJcbiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAiZmF0YWxpdGllczogIiwgZmF0YWxpdGllcywgIiwiLCAiXG4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnRuZXJzOiAiLCBwYXJ0bmVyc18yMDIxKSkpICsNCiAgZ2VvbV9wb2ludChhZXMoc2l6ZSA9IGNvbmZsaWN0X3Njb3JlKSwgYWxwaGEgPSAwLjgpICsNCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCIjNTc1QzZERkYiLCAiIzAwMjA0REZGIiwgIiNDNEI1NkNGRiIsICIjRkZFQTQ2RkYiKSkgKw0KICAjIHNjYWxlX2NvbG91cl92aXJpZGlzX2Qob3B0aW9uID0gImNpdmlkaXMiKSArDQogIHNjYWxlX3hfY29udGludW91cyhsYWJlbHMgPSBjb21tYSwgdHJhbnMgPSAibG9nMTAiKSArDQogIHNjYWxlX3lfY29udGludW91cyhsYWJlbHMgPSBjb21tYV9mb3JtYXQoYWNjdXJhY3kgPSAxKSwgdHJhbnMgPSAibG9nMTAiKSArDQogIGdlb21faGxpbmUoYWVzKHlpbnRlcmNlcHQgPSBtZWFuKHBvcHVsYXRpb25fZGVuc2l0eSwgbmEucm0gPSBUUlVFKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGdlb21fdmxpbmUoYWVzKHhpbnRlcmNlcHQgPSBtZWFuKGZzX3BpbiwgbmEucm0gPSBUUlVFKSksIGNvbG91ciA9ICJyZWQiLCBsdHkgPSAyKSArDQogIGxhYnMoeCA9ICJQZW9wbGUgaW4gbmVlZCIsIA0KICAgICAgIHkgPSAiUG9wdWxhdGlvbiBkZW5zaXR5IiwNCiAgICAgICB0aXRsZSA9ICJQZW9wbGUgaW4gbmVlZCBhbmQgcG9wdWxhdGlvbiBkZW5zaXR5IGJ5IHByaW9yaXRpc2F0aW9uIGdyb3VwIiwgDQogICAgICAgc3VidGl0bGUgPSAiTWVhbnMgb2YgYm90aCBheGVzIGFyZSBtYXJrZWQgYnkgdGhlIGRvdHRlZCByZWQgbGluZSIsDQogICAgICAgY29sb3VyID0gImdyb3VwIiwgDQogICAgICAgc2l6ZSA9ICJjb25mbGljdFxuc2NvcmUiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IEFDTEVEOyBhY2xlZGRhdGEuY29tIikgDQoNCmdncGxvdGx5KHBvcF9zY2F0dGVyLCB0b29sdGlwID0gYygidGV4dCIpKSAlPiUgDQogICMgbGF5b3V0KHNob3dsZWdlbmQgPSBGQUxTRSwgbGVnZW5kID0gbGlzdChmb250ID0gbGlzdChzaXplID0gNikpKSAlPiUgDQogIGNvbmZpZyhkaXNwbGF5TW9kZUJhciA9IEZBTFNFKSAlPiUgDQogIGxheW91dCh0aXRsZSA9IGxpc3QodGV4dCA9IHBhc3RlMCgiUGVvcGxlIGluIG5lZWQgYW5kIHBvcHVsYXRpb24gZGVuc2l0eSBieSBwcmlvcml0aXNhdGlvbiBncm91cCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGJyPiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPHN1cD4iLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1vdXNlIG92ZXIgZm9yIGRldGFpbHM7IG1lYW5zIG1hcmtlZCBieSByZWQgbGluZXM7IGNvbmZsaWN0IHNjb3JlIG1hcmtlZCBieSBzaXplIiwiPC9zdXA+IikpKQ0KYGBgDQoNCjxicj4NCg0KVGhlIHRhYmxlIGJlbG93IHByb3ZpZGVzIHNvbWUgc3VtbWFyeSBzdGF0aXN0aWNzIGZvciBlYWNoIG9mIHRoZSBmb3VyIGdyb3Vwcy4gSW5jbHVkZWQgYXJlIHRoZSBQSU4gYW5kIHBvcHVsYXRpb24gdGFyZ2V0ZWQgd2l0aGluIHRoZSB0b3duc2hpcHMgaW4gZWFjaCBncm91cCwgdGhlIGF2ZXJhZ2UgY29uZmxpY3Qgc2NvcmUgKGhpZ2hlciBjb25mbGljdCBzY29yZXMgaW5kaWNhdGUgYSBoaWdoZXIgaW5jaWRlbmNlIG9mIGNvbmZsaWN0KSwgdGhlIGF2ZXJhZ2UgcG9wdWxhdGlvbiBkZW5zaXR5IGFuZCB0aGUgbnVtYmVyIG9mIHRvd25zaGlwcyB3aXRoaW4gZWFjaCBncm91cDogDQoNCjxicj4NCg0KYGBge3IgdGFibGUtc3VtbWFyeS1zdGF0cy1ncm91cH0NCmZzX3BpbiAlPiUgDQogIGdyb3VwX2J5KGdyb3VwKSAlPiUgDQogIHN1bW1hcmlzZShQSU4gPSBzdW0oZnNfcGluKSwgDQogICAgICAgICAgICB0YXJnZXQgPSBzdW0oZnNfdGFyZ2V0ZWQpLA0KICAgICAgICAgICAgY29uZmxpY3Rfc2NvcmUgPSBtZWFuKGNvbmZsaWN0X3Njb3JlKSwNCiAgICAgICAgICAgIHBwbF9wZXJfa20yID0gbWVhbihwb3B1bGF0aW9uX2RlbnNpdHkpLA0KICAgICAgICAgICAgdG93bnNoaXBzID0gbigpKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGMoY29uZmxpY3Rfc2NvcmUpKSwgfnJvdW5kKC4sIGRpZ2l0cyA9IDMpKSAlPiUgDQogIG11dGF0ZV9hdCh2YXJzKGMoUElOLCBwcGxfcGVyX2ttMiwgdGFyZ2V0KSksIH4gcm91bmQoLikpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgdG93bnNoaXAgZ3JvdXAiLCBmb3JtYXQuYXJncyA9IGxpc3QoYmlnLm1hcmsgPSAiLCIpKSAlPiUgDQogIGthYmxlX2NsYXNzaWNfMigic3RyaXBlZCIpICU+JSANCiAgZm9vdG5vdGUoZm9vdG5vdGVfYXNfY2h1bmsgPSBUUlVFLCB0aHJlZXBhcnR0YWJsZSA9IFRSVUUsIA0KICAgICAgICAgICBnZW5lcmFsID0gIkdyb3VwcyBBMSBhbmQgQTIgaGF2ZSBhYm92ZSBhdmVyYWdlIGNvbmZsaWN0IHNjb3JlczsgZ3JvdXBzIEExIGFuZCBCMSBoYXZlIHRoZSBhYm92ZSBhdmVyYWdlIHBvcHVsYXRpb24gZGVuc2l0aWVzLiBUb3duc2hpcHMgaW4gZ3JvdXBzIEExIGFuZCBBMiBzaG91bGQgYmUgcHJpb3JpdGlzZWQgb3ZlciB0aGUgb3RoZXJzLiIpIA0KDQojICU+JQ0KIyAgc2F2ZV9rYWJsZShmaWxlID0gInN1bW1hcnlfc3RhdHNfZ3JvdXBzLnBuZyIsIHpvb20gPSAyKQ0KICANCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMi4zIExpbmtpbmcgZ2VvZ3JhcGhpYyBwcmlvcml0aXNhdGlvbiBhbmQgYmVuZWZpY2lhcnkgc2VsZWN0aW9uIA0KDQpVc2luZyB0aGUgY2xhc3NpZmljYXRpb25zIGZyb20gdGhlIHNpbXBsZSBkZWNpc2lvbiB0cmVlIGluIHNlY3Rpb24gMS4zLCB3ZSBjYW4gc2VlIHRoYXQgaW4gcnVyYWwgYXJlYXMsIHRoZSBoaWdoZXN0IHByb3BvcnRpb25zIG9mIHBlb3BsZSB3aG8gYXJlIGluIHRoZSBwcmlvcml0eSBncm91cCBhcmUgdGhvc2Ugd2hvIGhhdmUgYmVlbiBhZmZlY3RlZCBieSBjb25mbGljdCwgZm9sbG93ZWQgYnkgdGhvc2Ugd2hvIHdlcmUgYWZmZWN0ZWQgYnkgY29uZmxpY3QgYW5kIGhhdmUgbG9zdCB3b3JrIG9yIGVtcGxveW1lbnQgb3Bwb3J0dW5pdGllcy4gUnVyYWwgYXJlYXMgc2V2ZXJlbHktYWZmZWN0ZWQgYnkgY29uZmxpY3QgKHRoZSB0b3duc2hpcHMgaW4gZ3JvdXAgQTIpIGFyZSB0aGUgYXJlYXMgaW4gd2hpY2ggd2UgbWF5IHJlYWNoIHBvcHVsYXRpb25zIHdpdGggdGhlIGhpZ2hlc3QgcHJvcG9ydGlvbnMgb2YgaG91c2Vob2xkcyBpbiB0aGUgcHJpb3JpdHkgZ3JvdXAuDQoNCjxicj4NCg0KYGBge3J9DQpzdXJ2ZXkgJT4lIA0KICBtdXRhdGUocHJpb3JpdHlfYWRqID0gcHJpb3JpdHkgKiBjb21iaW5lZF93dCkgJT4lIA0KICBncm91cF9ieShydXJhbCwgc2hvY2tzX2NvbmZsaWN0LCBzaG9ja3NfbG9zdHdvcmspICU+JSANCiAgc3VtbWFyaXNlKHByaW9yaXR5ID0gc3VtKHByaW9yaXR5X2FkaiksIA0KICAgICAgICAgICAgdG90YWxfcG9wID0gc3VtKGNvbWJpbmVkX3d0KSkgJT4lIA0KICBtdXRhdGUocGMgPSByb3VuZChwcmlvcml0eSAvIHRvdGFsX3BvcCAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMocnVyYWwsIHNob2Nrc19jb25mbGljdCwgc2hvY2tzX2xvc3R3b3JrKSwgfnJlY29kZSguLCBgMGAgPSAibm8iLCBgMWAgPSAieWVzIikpICU+JSANCiAgZmlsdGVyKHBjID4gNDApICU+JQ0KICBzZWxlY3QoLXByaW9yaXR5LCAtdG90YWxfcG9wKSAlPiUgDQogIHJlbmFtZShgJV9Qcmlvcml0eWAgPSBwYywNCiAgICAgICAgIFJ1cmFsID0gcnVyYWwsIA0KICAgICAgICAgU2hvY2tzX0NvbmZsaWN0ID0gc2hvY2tzX2NvbmZsaWN0LCANCiAgICAgICAgIFNob2Nrc19Mb3N0X1dvcmsgPSBzaG9ja3NfbG9zdHdvcmspICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJXaGVyZSBhcmUgdGhlIGhpZ2hlc3QgcHJvcG9ydGlvbnMgb2YgcGVyc29ucyBpbiBwcmlvcml0eSBncm91cHM/IikgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpICU+JSANCiAgY29sdW1uX3NwZWMoMTo0LCB3aWR0aCA9ICI4ZW0iKSAlPiUgDQogIGZvb3Rub3RlKCJEYXRhIHNvdXJjZXM6IEFDTEVEOyBhY2xlZGRhdGEuY29tIGFuZCBGQU8tV0ZQIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KDQpgYGANCg0KPGJyPiANCg0KSW4gdXJiYW4gYXJlYXMsIGhvd2V2ZXIsIGNvbmZsaWN0IGluY2lkZW5jZSBpcyBub3QgYXMgaW1wb3J0YW50IG9mIGEgZGV0ZXJtaW5pbmcgZmFjdG9yIC0tIHRoZSBiZXN0IHJlc3VsdHMgY2FuIGJlIGFjaGlldmVkIGJ5IHRhcmdldGluZyBwZW9wbGUgd2hvIGhhdmUgbG9zdCB3b3JrIG9yIGVtcGxveW1lbnQgb3Bwb3J0dW5pdGllcywgaXJyZXNwZWN0aXZlIG9mIHdoZXRoZXIgb3Igbm90IHRoZXkgaGF2ZSBiZWVuIGFmZmVjdGVkIGJ5IGNvbmZsaWN0LiAgDQoNCjxicj4NCg0KYGBge3J9DQpzdXJ2ZXkgJT4lIA0KICBtdXRhdGUocHJpb3JpdHlfYWRqID0gcHJpb3JpdHkgKiBjb21iaW5lZF93dCkgJT4lIA0KICBncm91cF9ieShydXJhbCwgc2hvY2tzX2NvbmZsaWN0LCBzaG9ja3NfbG9zdHdvcmspICU+JSANCiAgc3VtbWFyaXNlKHByaW9yaXR5ID0gc3VtKHByaW9yaXR5X2FkaiksIA0KICAgICAgICAgICAgdG90YWxfcG9wID0gc3VtKGNvbWJpbmVkX3d0KSkgJT4lIA0KICBtdXRhdGUocGMgPSByb3VuZChwcmlvcml0eSAvIHRvdGFsX3BvcCAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgbXV0YXRlX2F0KHZhcnMocnVyYWwsIHNob2Nrc19jb25mbGljdCwgc2hvY2tzX2xvc3R3b3JrKSwgfnJlY29kZSguLCBgMGAgPSAibm8iLCBgMWAgPSAieWVzIikpICU+JSANCiAgZmlsdGVyKHBjIDw9IDQwKSAlPiUNCiAgc2VsZWN0KC1wcmlvcml0eSwgLXRvdGFsX3BvcCkgJT4lIA0KICByZW5hbWUoYCVfUHJpb3JpdHlgID0gcGMsDQogICAgICAgICBSdXJhbCA9IHJ1cmFsLCANCiAgICAgICAgIFNob2Nrc19Db25mbGljdCA9IHNob2Nrc19jb25mbGljdCwgDQogICAgICAgICBTaG9ja3NfTG9zdF9Xb3JrID0gc2hvY2tzX2xvc3R3b3JrKSAlPiUgDQogIGthYmxlKGNhcHRpb24gPSAiV2hpY2ggYXJlYXMgaGF2ZSBsZXNzIHBlb3BsZSBpbiB0aGUgcHJpb3JpdHkgZ3JvdXA/IikgJT4lIA0KICBrYWJsZV9jbGFzc2ljXzIoInN0cmlwZWQiLCBmdWxsX3dpZHRoID0gRkFMU0UpICU+JSANCiAgY29sdW1uX3NwZWMoMTo0LCB3aWR0aCA9ICI4ZW0iKSAlPiUgDQogIGZvb3Rub3RlKCJEYXRhIHNvdXJjZXM6IEFDTEVEOyBhY2xlZGRhdGEuY29tIGFuZCBGQU8tV0ZQIiwgZ2VuZXJhbF90aXRsZSA9ICIiKQ0KYGBgDQoNCjxicj4NCg0KQXMgbWVudGlvbmVkIGVhcmxpZXIsIHJ1cmFsIGhvdXNlaG9sZHMgd2VyZSBmb3VuZCB0byBiZSBsZXNzIHJlc2lsaWVudCBhbmQgbW9yZSBhc3NldC1wb29yIGluIElGUFJJJ3MgaG91c2Vob2xkIHdlbGZhcmUgc3VydmV5LiBUaGVzZSBmaW5kaW5ncyBhbGlnbiB3ZWxsIHdpdGggdGhlIHByb2Nlc3MgdGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciBoYXMgZGV2ZWxvcGVkIGhlcmUgdG8gaWRlbnRpZnkgcHJpb3JpdHkgaG91c2Vob2xkcyAod2hlcmUgcnVyYWwgaG91c2Vob2xkcyBhcmUgc2lnbmlmaWNhbnRseSBtb3JlIGxpa2VseSB0byBmYWxsIGludG8gdGhlIHByaW9yaXR5IGdyb3VwKS4gSXQgd291bGQgYmUgZXh0cmVtZWx5IGZydWl0ZnVsIHRvIGV4cGxvcmUgd2hldGhlciB0aGlzIGFsaWdubWVudCBleHRlbmRzIHRvIGNvbmZsaWN0IGFuZCBzb21lIG9mIHRoZSBvdGhlciBlbnZpcm9ubWVudGFsIGFuZCBzb2Npb2Vjb25vbWljIHZhcmlhYmxlcyB0aGF0IGhhdmUgYmVlbiBlbXBsb3llZCBpbiB0aGlzIGRvY3VtZW50LiANCg0KPGJyPjxicj4NCg0KIyMjIDIuNCBNYXBzIG9mIGNvbmZsaWN0IHNjb3JlcyBhbmQgcHJpb3JpdGlzYXRpb24gZ3JvdXANCg0KYGBge3IgbWFwLWNvbmZsaWN0LXNjb3JlLCBmaWcuaGVpZ2h0PTl9DQoNCmZzX3BpbiAlPiUgDQogIHJpZ2h0X2pvaW4ocGNvZGUzX3NoYXBlLCBieSA9ICJhZG1pbjNfcGNvZGUiKSAlPiUgDQogIHN0X2FzX3NmKCkgJT4lIA0KICBnZ3Bsb3QoKSArDQogIGdlb21fc2YoYWVzKGZpbGwgPSBjb25mbGljdF9zY29yZSksIHNpemUgPSAwLjEpICsgDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSArIA0KICBzY2FsZV9maWxsX3ZpcmlkaXNfYyhvcHRpb24gPSAibWFnbWEiLCBkaXJlY3Rpb24gPSAtMSkgKw0KICB0aGVtZV92b2lkKCkgKyANCiAgbGFicyh0aXRsZSA9ICJDb25mbGljdCBzY29yZSBieSB0b3duc2hpcCAyMDIxIiwNCiAgICAgICBjYXB0aW9uID0gIkRhdGEgc291cmNlOiBBQ0xFRDsgYWNsZWRkYXRhLmNvbSIsDQogICAgICAgZmlsbCA9ICJDb25mbGljdFxuc2NvcmUiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSBOQSkpICsNCg0KZnNfcGluICU+JSANCiAgbGVmdF9qb2luKHBjb2RlM19zaGFwZSwgYnkgPSAiYWRtaW4zX3Bjb2RlIikgJT4lIA0KICBzdF9hc19zZigpICU+JSANCiAgZ2dwbG90KCkgKyANCiAgZ2VvbV9zZihhZXMoZmlsbCA9IGdyb3VwKSwgc2l6ZSA9IDAuMSwgY29sb3VyID0gImdyYXkyMCIpICsgDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBzaXplID0gMC41KSArDQogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiM1NzVDNkRGRiIsICIjMDAyMDRERkYiLCAiI0M0QjU2Q0ZGIiwgIiNGRkVBNDZGRiIpKSArDQogICMgc2NhbGVfZmlsbF92aXJpZGlzX2QoZW5kID0gMC45LCBvcHRpb24gPSAiY2l2aWRpcyIpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgbGFicyh0aXRsZSA9ICJUb3duc2hpcHMgYnkgcHJpb3JpdGlzYXRpb24gZ3JvdXAiLCANCiAgICAgICBmaWxsID0gInByaW9yaS1cbnRpc2F0aW9uXG5ncm91cCIsDQogICAgICAgY2FwdGlvbiA9ICJEYXRhIHNvdXJjZTogQUNMRUQ7IGFjbGVkZGF0YS5jb20gYW5kIEZTQyBjYWxjdWxhdGlvbnMiKSArDQogIHRoZW1lKHBsb3QuY2FwdGlvbj1lbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpLCANCiAgICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSBOQSkpICANCiAgDQojIGdnc2F2ZSgiY29uZmxpY3Rfc2NvcmVfbWFwLnBuZyIsIGRwaSA9IDMwMCwgaGVpZ2h0ID0gMTIsIHdpZHRoID0gNywgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyAyLjUgUmVmZXJlbmNlIHRhYmxlIGZvciBjb25mbGljdCB2YXJpYWJsZXMNCg0KQmVsb3cgaXMgYW4gaW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlIGZvciB0aGUgdmFyaW91cyB0eXBlcyBvZiBjb25mbGljdCBldmVudHMgYnkgdG93bnNoaXAuIEl0IGFsc28gaW5jbHVkZXMgdGhlIG92ZXJhbGwgY29uZmxpY3Qgc2NvcmUgYW5kIHByaW9yaXRpc2F0aW9uIGdyb3Vwcy4gVGhlIHNlYXJjaCBiYXIgY2FuIGJlIHVzZWQgdG8gZmluZCBzcGVjaWZpYyB0b3duc2hpcHMsIG9yIGFueSBvZiB0aGUgY29sdW1ucyBtYXkgYmUgc29ydGVkIGFjY29yZGluZyB0byBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyB2YWx1ZXMuIFRoZSB0YWJsZSBjdXJyZW50bHkgc2hvd3MgdG93bnNoaXBzIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgY29uZmxpY3Qgc2NvcmUuIA0KDQo8YnI+DQoNCmBgYHtyfQ0KZnNfcGluICU+JSANCiAgc2VsZWN0KHN0YXRlLCB0b3duc2hpcCwgcG9wXzIwMjEgPSBwb3B1bGF0aW9uXzIwMjFfcHJvaiwgcHBsX2ttMiA9IHBvcHVsYXRpb25fZGVuc2l0eSwgDQogICAgICAgICBQSU4gPSBmc19waW4sIHRhcmdldCA9IGZzX3RhcmdldGVkLA0KICAgICAgICAgZ3JvdXAsIGNvbmZsaWN0X3Njb3JlLCBmYXRhbGl0aWVzLA0KICAgICAgICAgYmF0dGxlcywgZXhwbG9zaW9uc19yZW1vdGVfdmlvbGVuY2UsIHByb3Rlc3RzX2FuZF9yaW90cywgc3RyYXRlZ2ljX2RldmVsb3BtZW50cywgdmlvbGVuY2VfYWdhaW5zdF9jaXZpbGlhbnMsDQogICAgICAgICBhZG1pbjNfcGNvZGUpICU+JSANCiAgYXJyYW5nZShkZXNjKGNvbmZsaWN0X3Njb3JlKSkgJT4lIA0KICBkYXRhdGFibGUoZmlsdGVyID0gbGlzdChwb3NpdGlvbiA9ICJ0b3AiLCBjbGVhciA9IEZBTFNFKSwNCiAgICAgICAgICAgIG9wdGlvbnMgPSBsaXN0KHBhZ2VMZW5ndGggPSAxMCwgc2Nyb2xsWCA9IFRSVUUpLA0KICAgICAgICAgICAgY2FwdGlvbiA9IGh0bWx0b29sczo6dGFncyRjYXB0aW9uKHN0eWxlID0gImNhcHRpb24tc2lkZTogdG9wOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC1zaXplOiAxNDAlOyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMjEgY29uZmxpY3QgaW5kaWNhdG9ycyBieSB0b3duc2hpcCIpKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoInBvcF8yMDIxIiwgInBwbF9rbTIiLCAidGFyZ2V0IiwgIlBJTiIpLCBkaWdpdHMgPSAwKSAlPiUgDQogIGZvcm1hdFJvdW5kKGMoImNvbmZsaWN0X3Njb3JlIiksIGRpZ2l0cyA9IDIpDQogDQpgYGANCg0KPGJyPjxicj48YnI+DQoNCiMjIDMuIERpc3RyaWJ1dGlvbiBvZiBmbG9vZCByaXNrIGluIE15YW5tYXINCg0KDQojIyMgMy4xIEhpc3RvcmljYWwgZmxvb2QgZGF0YSANCg0KSW4gbGlnaHQgb2YgdGhlIGltcGVuZGluZyBtb25zb29uIHNlYXNvbiwgdGhlIHByb2JhYmlsaXR5IHRoYXQgYSB0b3duc2hpcCB3aWxsIGJlIGFmZmVjdGVkIGJ5IGEgbWFqb3IgZmxvb2Qgb3IgY3lsY29uaWMgZXZlbnQgaGFzIGJlZW4gY2FsY3VsYXRlZC4gTWFqb3IgZmxvb2RzIHNpbmNlIDIwMDggaGF2ZSBiZWVuIGZhY3RvcmVkIGludG8gdGhpcyBjYWxjdWxhdGlvbi4gDQoNCkZvciB0aGUgbW9tZW50LCBjb25mbGljdCBpbmNpZGVuY2UgYW5kIGZsb29kIGFuZCBjeWNsb25lIHJpc2sgd2lsbCBiZSBldmFsdWF0ZWQgc2VwYXJhdGVseS4gRmxvb2QgYW5kIHN0b3JtIHN1cmdlIHJpc2sgZXhpc3QgYXMgcHJvYmFiaWxpdGllcyBmb3IgdGhlIG1vbWVudCBhbmQgYXJlIGludGVuZGVkIHRvIHN1cHBvcnQgcHJlcG9zaXRpb25pbmcgYW5kIERpc2FzdGVyIFJpc2sgUmVkdWN0aW9uOyB0aGlzIG1pZ2h0IGNoYW5nZSB3ZXJlIHNldmVyZSBmbG9vZGluZyB0byBvY2N1ciBpbiAyMDIyLiANCg0KPGJyPg0KDQpgYGB7ciBiYXJwbG90LWZsb29kLXJpc2t9DQpmbG9vZHNfc3Rvcm1fc3VyZ2UgJT4lIA0KICBzZWxlY3Qoc3RhcnRzX3dpdGgoInllYXJfIiksIGFkbWluM19wY29kZSkgJT4lIA0KICBwaXZvdF9sb25nZXIoY29scyA9IGMoLWFkbWluM19wY29kZSksIG5hbWVzX3RvID0gImZsb29kcyIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JSANCiAgbXV0YXRlKGZsb29kcyA9IHN0cl9yZW1vdmVfYWxsKGZsb29kcywgInllYXJfIikpICU+JSANCiAgZ3JvdXBfYnkoZmxvb2RzKSAlPiUgDQogIGZpbHRlcih2YWx1ZSA9PSBUUlVFKSAlPiUgDQogIHN1bW1hcmlzZSh0b3duc2hpcHNfYWZmZWN0ZWQgPSBuKCkpICU+JSANCiAgbXV0YXRlKGZsb29kcyA9IGZjdF9yZXYoZmxvb2RzKSkgJT4lIA0KICBnZ3Bsb3QoYWVzKHggPSB0b3duc2hpcHNfYWZmZWN0ZWQsIHkgPSBmbG9vZHMsIGZpbGwgPSBmbG9vZHMpKSArIA0KICBnZW9tX2NvbCgpICsgIA0KICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIsIA0KICAgICAgICBwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArDQogIGxhYnMoeSA9ICIiLCANCiAgICAgICB4ID0gIk51bWJlciBvZiB0b3duc2hpcHMgYWZmZWN0ZWQiLCANCiAgICAgICB0aXRsZSA9ICJUb3duc2hpcHMgYWZmZWN0ZWQgYnkgZmxvb2RzIGFuZCBzdG9ybSBzdXJnZXMgKDIwMDgtMjAyMSkiLA0KICAgICAgIGNhcHRpb24gPSAiRGF0YSBzb3VyY2U6IE1JTVUgYW5kIFVORFAiKQ0KDQogIyBnZ3NhdmUoImJ5X2Zsb29kcy5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDUsIHdpZHRoID0gOCwgdW5pdHMgPSAiaW4iKQ0KYGBgDQoNCjxicj4NCg0KQmFzZWQgb24gdGhpcyBkYXRhLCBhIHNjb3JlIHdhcyBjYWxjdWxhdGVkIGZvciBlYWNoIHRvd25zaGlwIGJhc2VkIG9uIGhvdyBtYW55IHRpbWVzIGl0IGhhZCBiZWVuIGFmZmVjdGVkIGJ5IGZsb29kcyBzaW5jZSAyMDA4LiBUaGUgdGFibGUgYmVsb3cgYWxzbyBzdW1tYXJpc2VzIHRoZSBudW1iZXIgb2YgcGVvcGxlIGluIG5lZWQgKDIwMjIpLiBgciBmc19waW4gJT4lIGZpbHRlcihmbG9vZF9jb3VudCA+IDQpICU+JSB7c3VtKC4kZnNfcGluKX0gJT4lIHJvdW5kKCkgJT4lIGZvcm1hdChiaWcubWFyayA9ICIsIilgIHBlb3BsZSBsaXZlIGluIHRvd25zaGlwcyB0aGF0IGhhdmUgZmxvb2RlZCBtb3JlIHRoYW4gNSB0aW1lcyBzaW5jZSAyMDA4LiANCg0KYGBge3J9DQpmc19waW4gJT4lIA0KICByZXBsYWNlX25hKGxpc3QoZmxvb2RfY291bnQgPSAwKSkgJT4lIA0KICAjIG11dGF0ZShmbG9vZF9jb3VudCA9IGlmZWxzZShmbG9vZF9jb3VudCA+IDQsICI1LTkiLCBmbG9vZF9jb3VudCkpICU+JSANCiAgZ3JvdXBfYnkoZmxvb2RfY291bnQpICU+JSANCiAgc3VtbWFyaXNlKHRvd25zaGlwcyA9IG4oKSwNCiAgICAgICAgICAgIHBlb3BsZV9pbl9uZWVkID0gcm91bmQoc3VtKGZzX3BpbiksIGRpZ2l0cyA9IDApKSAlPiUgDQogIGFycmFuZ2UoZGVzYyhmbG9vZF9jb3VudCkpICU+JSANCiAga2FibGUoY2FwdGlvbiA9ICJTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgbnVtYmVyIG9mIGZsb29kcyAoMjAwOC0yMDIxKSIsIGZvcm1hdC5hcmdzID0gbGlzdChiaWcubWFyayA9ICIsIikpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikgJT4lIA0KICBmb290bm90ZSgiRGF0YSBzb3VyY2U6IE1JTVUgYW5kIFVORFAiLCBnZW5lcmFsX3RpdGxlID0gIiIpDQoNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMy4yIE1hcCBvZiBmbG9vZCByaXNrIA0KDQpUaGUgbWFwIGJlbG93IHNob3dzIHRoZSBwcm9iYWJpbGl0eSBvZiBlYWNoIHRvd25zaGlwIGJlaW5nIGFmZmVjdGVkIGJ5IGZsb29kcy4gVGhlIGFyZWFzIHdpdGggdGhlIGdyZWF0ZXN0IHJpc2sgb2YgZmxvb2RpbmcgYXJlIGluIE1vbiwgbmVhciB0aGUgbW91dGggb2YgdGhlIFNpdHRhdW5nIFJpdmVyIGFuZCB0aGUgR3VsZiBvZiBNb3R0YW1hIGFuZCB0aG9zZSBhbG9uZyB0aGUgQXlleWFyd2FkeSBSaXZlciwgYW5kIHRvIGEgbGVzc2VyIGV4dGVudCwgYWxvbmcgdGhlIENoaW5kd2luIFJpdmVyLiANCg0KPGJyPg0KDQpgYGB7ciBtYXAtZmxvb2RzLCBmaWcuaGVpZ2h0ID0gMTJ9DQoNCmZzX3BpbiAlPiUgDQogIGxlZnRfam9pbihwY29kZTNfc2hhcGUsIGJ5ID0gImFkbWluM19wY29kZSIpICU+JSANCiAgc3RfYXNfc2YoKSAlPiUgDQogIGdncGxvdCgpICsNCiAgZ2VvbV9zZihzaXplID0gMC4xLCBhZXMoZmlsbCA9IGZsb29kX3Byb2IpKSArDQogIGdlb21fc2YoZGF0YSA9IHBjb2RlMV9zaGFwZSwgc2l6ZSA9IDAuNSwgYWxwaGEgPSAwLCBjb2xvdXIgPSAiZ3JheTIwIikgKw0KICBzY2FsZV9maWxsX3ZpcmlkaXMob3B0aW9uID0gInBsYXNtYSIsIGRpcmVjdGlvbiA9IC0xLCBsYWJlbCA9IHBlcmNlbnRfZm9ybWF0KGFjY3VyYWN5ID0gMSkpICsNCiAgdGhlbWVfdm9pZCgpICsNCiAgdGhlbWUocGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGwgPSAid2hpdGUiLCBjb2xvdXIgPSBOQSksDQogICAgICAgIHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsNCiAgbGFicyh0aXRsZSA9ICJGbG9vZCByaXNrIGluIE15YW5tYXIgKDIwMDgtMjAyMSkiLCANCiAgICAgICBmaWxsID0gImZsb29kXG5yaXNrIiwgDQogICAgICAgY2FwdGlvbiA9ICAiRGF0YSBzb3VyY2U6IE1JTVUgYW5kIFVORFAiKQ0KDQojIGdnc2F2ZSgiZmxvb2Rfcmlzay5wbmciLCBkcGkgPSAzMDAsIGhlaWdodCA9IDEyLCB3aWR0aCA9IDcsIHVuaXRzID0gImluIikNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgMy4zIFJlZmVyZW5jZSB0YWJsZSBmb3IgZmxvb2QgcmlzayANCg0KQmVsb3cgaXMgYW4gaW50ZXJhY3RpdmUgcmVmZXJlbmNlIHRhYmxlIGZvciBmbG9vZCByaXNrIGJ5IHRvd25zaGlwLiBJdCBpbmNsdWRlcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHNpbmNlIDIwMDggYSB0b3duc2hpcCBoYXMgYmVlbiBhZmZlY3RlZCBieSBmbG9vZGluZyAoZmxvb2RfY291bnQpIGFuZCB0aGUgcHJvYmFiaWxpdHkgb2YgZmxvb2RpbmcgKGZsb29kX3Jpc2spLiBTaW1pbGFyIHRvIHRoZSBpbnRlcmFjdGl2ZSB0YWJsZSBpbiB0aGUgcHJldmlvdXMgY2hhcHRlciwgdGhlIHNlYXJjaCBiYXIgY2FuIGJlIHVzZWQgdG8gZmluZCBzcGVjaWZpYyB0b3duc2hpcHMgYW5kIGFueSBvZiB0aGUgY29sdW1ucyBtYXkgYmUgc29ydGVkIGFjY29yZGluZyB0byBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyB2YWx1ZXMuIFRoZSB0YWJsZSBjdXJyZW50bHkgc2hvd3MgdG93bnNoaXBzIHNvcnRlZCBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIGZsb29kIHJpc2suDQoNCjxicj4NCg0KDQpgYGB7cn0NCmZzX3BpbiAlPiUgDQogIHNlbGVjdChzdGF0ZSwgdG93bnNoaXAsIHBvcF8yMDIxID0gcG9wdWxhdGlvbl8yMDIxX3Byb2osIHBwbF9rbTIgPSBwb3B1bGF0aW9uX2RlbnNpdHksIA0KICAgICAgICAgUElOID0gZnNfcGluLCB0YXJnZXQgPSBmc190YXJnZXRlZCwNCiAgICAgICAgIGZsb29kX3Jpc2sgPSBmbG9vZF9wcm9iLCBmbG9vZF9jb3VudCwNCiAgICAgICAgIGFkbWluM19wY29kZSkgJT4lIA0KICBhcnJhbmdlKGRlc2MoZmxvb2RfcmlzaykpICU+JSANCiAgZGF0YXRhYmxlKGZpbHRlciA9IGxpc3QocG9zaXRpb24gPSAidG9wIiwgY2xlYXIgPSBGQUxTRSksDQogICAgICAgICAgICBvcHRpb25zID0gbGlzdChwYWdlTGVuZ3RoID0gMTAsIHNjcm9sbFggPSBUUlVFKSwNCiAgICAgICAgICAgIGNhcHRpb24gPSBodG1sdG9vbHM6OnRhZ3MkY2FwdGlvbihzdHlsZSA9ICJjYXB0aW9uLXNpZGU6IHRvcDsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7IGZvbnQtc2l6ZTogMTQwJTsiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGbG9vZCByaXNrIGJ5IHRvd25zaGlwIikpICU+JSANCiAgZm9ybWF0Um91bmQoYygicG9wXzIwMjEiLCAicHBsX2ttMiIsICJ0YXJnZXQiLCAiUElOIiksIGRpZ2l0cyA9IDApICU+JSANCiAgZm9ybWF0Um91bmQoYygiZmxvb2RfcmlzayIpLCBkaWdpdHMgPSAyKQ0KIA0KYGBgDQoNCjxicj48YnI+PGJyPg0KDQojIyA0LiBUZWNobmljYWwgbm90ZXMNCg0KVGhlc2UgYW5uZXhlcyBjb250YWluIGFkZGl0aW9uYWwgdGVjaG5pY2FsIGluZm9ybWF0aW9uIHRoYXQgaW5mb3JtZWQgdGhlIGRlY2lzaW9ucyBpbiB0aGUgZWFybGllciBzZWN0aW9ucy4gDQoNCg0KIyMjIDQuMSBMaW1pdGF0aW9ucyBvZiB0aGUgRkFPLVdGUCBzdXJ2ZXkgTmV4dCBzdGVwcyANCg0KDQpUaGUgbW9zdCBpbXBvcnRhbnQgbGltaXRhdGlvbiBvZiB0aGUgRkFPLVdGUCBzdXJ2ZXkgd2FzIHRoZSBleGNsdXNpb24gb2Ygc2V2ZXJhbCBrZXkgc3RhdGVzIGFuZCByZWdpb25zIGZyb20gdGhlIHN1cnZleS4gT2YgcGFydGljdWxhciBpbnRlcmVzdCBhcmUgU2FnYWluZywgTWFnd2F5IGFuZCBNYW5kYWxheSB3aGVyZSB0aGUgY29uZmxpY3QgaGFzIGJlZW4gcGFydGljdWxhcmx5IGludGVuc2UuIA0KDQpGdXJ0aGVybW9yZSwgdGhlIGRyeSB6b25lIHdhcyBub3Qgc3VydmV5ZWQuIEZyb20gYW4gYWdyaWN1bHR1cmFsIHBlcnNwZWN0aXZlLCB0aGlzIGlzIGEgbWFqb3Igb21pc3Npb24gYXMgdGhlIGRpdmVyc2l0eSBvZiBjcm9wcyBhbmQsIGNvbnNlcXVlbnRseSwgZGlldHMgYXJlIG11Y2ggaGlnaGVyIGluIHRoZSBkcnkgem9uZSB0aGFuIGluIHRoZSBvdGhlciBwYXJ0cyBvZiB0aGUgY291bnRyeSwgd2hpY2ggYXJlIHByZWRvbWluYW50bHkgZm9jdXNlZCBvbiBwYWRkeS4NCg0KSW4gc3BpdGUgb2YgdGhlc2UgbWFqb3IgbGltaXRhdGlvbnMgYW5kIHRoZSBudW1lcm91cyBhc3N1bXB0aW9ucyB0aGF0IGhhdmUgaGFkIHRvIG1hZGUsIHRoZSBGQU8tV0ZQIHN1cnZleSBpcyBtb3N0IGNvbXByZWhlbnNpdmUgZGF0YXNldCBvbiBmb29kIHNlY3VyaXR5IHRoYXQgaGFzIGJlZW4gY29sbGVjdGVkIHNvIGZhci4gQWRkaXRpb25hbCBlZmZvcnRzIHdpbGwgYmUgbWFkZSB0byBjcm9zcy1yZWZlcmVuY2UgdGhlc2UgZGF0YSBmcm9tIHRob3NlIG9mIG90aGVyIHN1cnZleXMuIFRoZXNlIG1vZGVscyB3aWxsIGJlIHVwZGF0ZWQgb25jZSB0aGUgdGhpcmQgcm91bmQgb2YgdGhlIEZBTy1XRlAgc3VydmV5IGlzIHJlYWR5LiBBcyBhIGZpbmFsIHBvaW50IGluIHRoaXMgc2VjdGlvbiwgdGhlIEZBTy1XRlAgc3VydmV5LCBpbiBzcGl0ZSBvZiBpdHMgbGltaXRhdGlvbnMgZm9ybXMgdGhlIGJhc2lzIG9mIHRoZSBQZW9wbGUgaW4gTmVlZCBjYWxjdWxhdGlvbnMuIA0KDQpUaGlzIHBhcGVyIHNlcnZlcyBhIHByb3Bvc2FsIG9uIGhvdyB2dWxuZXJhYmxlIGhvdXNlaG9sZHMgKHN1Y2ggYXMgdGhvc2UgaW4gdGhlIHByaW9yaXR5IGdyb3VwKSBtYXkgYmUgaWRlbnRpZmllZCBhbmQgdGFyZ2V0ZWQuIFNob3VsZCB0aGlzIG1ldGhvZG9sb2d5IHByb3ZlIHNvdW5kIGFuZCB2aWFibGUsIGl0IGlzIHN1Z2dlc3RlZCB0aGF0IGl0IGJlIGFwcGxpZWQgdG8gZWl0aGVyIElGUFJJJ3MgSG91c2Vob2xkIFdlbGZhcmUgU3VydmV5IGFzIHdlbGwgYXMgZGF0YSBjb2xsZWN0ZWQgaW4gdGhlIHRoaXJkIHJvdW5kIG9mIHRoZSBGQU8tV0ZQIGZvb2Qgc2VjdXJpdHkgc3VydmV5LiANCg0KDQo8YnI+PGJyPg0KDQojIyMgNC4yIENhbGN1bGF0aW9uIG9mIHRoZSBmb29kIGluc2VjdXJpdHkgc2NvcmUNCg0KRm9vZCBpbnNlY3VyaXR5IGhlcmUgaXMgbm90IHJlY29nbmlzZWQgc29sZWx5IGFzIGEgZm9vZCBzZWN1cmUvZm9vZCBpbnNlY3VyZSBkaWNob3RvbXkgYW5kIGlzIGluc3RlYWQgdHJlYXRlZCBhcyBhIG1hdHRlciBvZiBkZWdyZWUgZGV0ZXJtaW5lZCBieSBhbiBob3VzZWhvbGQncyBwb3NpdGlvbiB0aGUgb3ZlcmFsbCBkaXN0cmlidXRpb24gb2YgZm9vZCBzZWN1cml0eSBpbmRpY2F0b3JzLiBBY2NvcmRpbmcgdG8gQmV0dGkgYW5kICBWZXJtYSwgImJ5IGFwcHJvcHJpYXRlbHkgd2VpZ2h0aW5nIG5vbi1tb25ldGFyeSBpbmRpY2F0b3JzIG9mIGRlcHJpdmF0aW9uIHRvIHJlZmxlY3QgdGhlaXIgZGlzcGVyc2lvbiBhbmQgY29ycmVsYXRpb24sIGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCBxdWFudGl0YXRpdmUgaW5kaWNlcyBvZiBkZXByaXZhdGlvbiBpbiBpdHMgdmFyaW91cyBkaW1lbnNpb25zIi4gQXQgaXRzIG1vc3QgYmFzaWMsIHRoZSBmb29kIGluc2VjdXJpdHkgc2NvcmUgaXMgYSB3ZWlnaHRlZCBhdmVyYWdlIG9mIGl0cyBjb21wb25lbnQgaW5kaWNhdG9ycyB0aGF0IHJld2FyZHMgdmFyaWFibGVzIHRoYXQgYXJlIHJlc3BvbnNpYmxlIGZvciBtb3JlIG9mIHRoZSB2YXJpYXRpb24gaW4gdGhlIGRhdGFzZXQuIA0KDQpUbyBjYWxjdWxhdGUgdGhlIGZvb2QgaW5zZWN1cml0eSBzY29yZSwgdmFyaWFibGVzIHdpdGhpbiB0aGUgTGl2ZWxpaG9vZCBDb3BpbmcgU3RyYXRlZ2llcyBJbmRleCwgRm9vZCBDb25zdW1wdGlvbiBTY29yZSBhbmQgRm9vZCBJbnNlY3VyaXR5IEV4cGVyaWVuY2Ugc2NhbGUgd2VyZSByZXNjYWxlZCB0byB2YWx1ZXMgYmV0d2VlbiAkMCQgYW5kICQxJC4gRm9yIG1vc3Qgb2YgdGhlIHZhcmlhYmxlcywgJDEkIG1lYW50ICJ5ZXMiIGFuZCAkMCQgbWVhbnQgIm5vIjsgaG93ZXZlciwgZm9yIHRoZSBGb29kIENvbnN1bXB0aW9uIFNjb3JlIGluZGljYXRvcnMsICQwJCBtZWFudCB0aGF0IGEgaG91c2Vob2xkIGhhZCBjb25zdW1lZCB0aGF0IGZvb2QgZ3JvdXAgZXZlcnkgZGF5IGZvciB0aGUgcGFzdCA3IGRheXMgYW5kICQxJCBtZWFudCB0aGF0IGEgaG91c2Vob2xkIGhhZCBub3QgY29uc3VtZWQgdGhhdCBmb29kIGdyb3VwIGZvciBhbnkgb2YgdGhlIHByaW9yIDcgZGF5cy4gQWRkaXRpb25hbGx5LCBjb3Bpbmcgc3RyYXRlZ2llcyBpbmRpY2F0b3JzIGF0IHRoZSAiY3Jpc2lzIiBsZXZlbCB3ZXJlIGNvZGVkIGFzICQwLjUkIGZvciAieWVzIiBhbmQgaW5kaWNhdG9ycyBhdCB0aGUgImVtZXJnZW5jeSIgbGV2ZWwgd2VyZSBjb2RlZCBhcyAkMSQgZm9yICJ5ZXMiLiBUaGlzIGlzIHRvIHJlcGxhY2UgdGhlIHR5cGljYWwgc2V2ZXJpdHkgd2VpZ2h0aW5nIHRoYXQgd291bGQgbm9ybWFsbHkgaGF2ZSBvY2N1cnJlZCBidXQgd2FzIG5vdCBwYXJ0IG9mIHRoZSBGQU8tV0ZQIHN1cnZleSBwcm9jZXNzLiANCg0KVGhlc2UgY2FsY3VsYXRpb25zIGhhdmUgYmVlbiBlbmNvZGVkIGluIHRoZSBSIHBhY2thZ2UgKipgbWRlcHJpdmAqKiBieSBBdHRpbGlvIGFuZCBBbGRvIEJlbmluaSwgYnVpbGRpbmcgb24gd29yayBkb25lIGJ5IEFscGVyaW4gYW5kIFZhbiBLZXJtIG9uIHRoZWlyICoqYG1kZXByaXZgKiogU3RhdGEgcGFja2FnZS4gQWNjb3JkaW5nIHRvIEFscGVyaW4gYW5kIFZhbiBLZXJtLCAiKipgbWRlcHJpdmAqKiBjcmVhdGVzIHN5bnRoZXRpYyBzY29yZXMgb2YgZGVwcml2YXRpb24gdGhhdCBhcmUgbGluZWFyIGZ1bmN0aW9ucyBvZiB1bmktZGltZW5zaW9uYWwgZGVwcml2YXRpb24gaXRlbXMgbWVhc3VyZWQgb24gdGhlIFswLCAxXSBzY2FsZS4gV2l0aCAkeF97aWp9JCBkZW5vdGluZyB0aGUgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIGRlcHJpdmF0aW9uIGl0ZW1zICRqJCBmb3Igb2JzZXJ2YXRpb24gJGkkLiBUaGUgc3ludGhldGljIHNjb3JlcyBjYWxjdWxhdGVkIGJ5ICoqYG1kZXByaXZgKiogYXJlIHdlaWdodGVkIHN1bXMgb2YgdGhlICRNJCBkZXByaXZhdGlvbiBpdGVtczogDQoNCiQkDQpzX2kgPSBcc3VtX3tqID0gMX1ee019e3dfan14X3tpan0NCiQkDQoNCkEgZm9vZCBpbnNlY3VyaXR5IHNjb3JlIHdhcyB0aGVuIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIHdlaWdodGVkIHN1bSBvZiB0aGUgaW5kaXZpZHVhbCB2YXJpYWJsZXMuIFRoZSB3ZWlnaHRpbmcgc2NoZW1lIGNob3NlbiB3YXMgdGhlIGRlZmF1bHQgZm9yIHRoZSAqKmBtZGVwcml2YCoqIHBhY2thZ2UsIENlcmlvbGkgYW5kIFphbmkgKDE5OTApIHdlaWdodGluZy4gVW5kZXIgdGhpcyB3ZWlnaHRpbmcgc2NoZW1lLCB2YXJpYWJsZSB3ZWlnaHRzIGFyZSAiZnJlcXVlbmN5LWJhc2VkIiBhbmQgYXJlIGEgZnVuY3Rpb24gb2YgdGhlaXIgc2FtcGxlIG1lYW4gYnV0IGp1c3Qgc2xpZ2h0bHkgbW9kaWZpZWQgdG8gZ2l2ZSBhIHN0cm9uZ2VyIHdlaWdodCB0byByZWxhdGl2ZWx5IHJhcmUgaXRlbXMgc28gdGhhdCB2YXJpYXRpb24gaXMgcmV3YXJkZWQ6IA0KDQokJA0Kd19qIFxwcm9wdG8gbG9nKFxmcmFjezF9e1xiYXJ7eH1fan0pDQokJA0KPGJyPg0KDQpUaGUgc3BlY2lmaWMgY29kZSBmb3IgZ2VuZXJhdGluZyB0aGUgZm9vZCBpbnNlY3VyaXR5IHNjb3JlIHdhczoNCg0KYGBge3IgZWNobyA9IFRSVUV9DQpmb29kX2luc2VjdXJpdHlfc2NvcmUgPC0gc3VydmV5ICU+JSANCiAgbXV0YXRlX2F0KHZhcnMoY3NfY3Jpc2lzX3NvbGRfcHJvZF9hc3NldHMsIGNzX2NyaXNpc19ub19zY2hvb2wsIA0KICAgICAgICAgICAgICAgICBjc19jcmlzaXNfcmVkdWNlZF9oZWFsdGhfZXhwKSwgfiAuICogMC41KSAlPiUgDQogIHNlbGVjdChzdXJ2ZXlfaWQsIGZjc19zdGFwbGUsIGZjc19wdWxzZSwgZmNzX2RhaXJ5LCANCiAgICAgICAgIGZjc19wcm90ZWluLCBmY3NfdmVnLCBmY3NfZnJ1aXQsIGZjc19mYXQsIGZjc19zdWdhciwgDQogICAgICAgICBjc19jcmlzaXNfc29sZF9wcm9kX2Fzc2V0cywgY3NfY3Jpc2lzX25vX3NjaG9vbCwgY3NfY3Jpc2lzX3JlZHVjZWRfaGVhbHRoX2V4cCwgDQogICAgICAgICBjc19lbWVyZ2VuY3lfc29sZF9ob3VzZSwgY3NfZW1lcmdlbmN5X2hoX21pZ3JhdGlvbiwgY3NfZW1lcmdlbmN5X2hoX3Jpc2ssDQogICAgICAgICBmaWVzX2Zld2Zvb2QsIGZpZXNfc2tpcHBlZCwgZmllc193aGxkYXksIGZpZXNfaHVuZ3J5LCBmaWVzX2F0ZWxlc3MsIGZpZXNfaGVhbHRoeSwNCiAgICAgICAgIGZpZXNfcnVub3V0LCBmaWVzX3dvcnJpZWQpICU+JSANCiAgbWRlcHJpdihjKCJmY3Nfc3RhcGxlIiwgImZjc19wdWxzZSIsICJmY3NfZGFpcnkiLCANCiAgICAgICAgICAgICJmY3NfcHJvdGVpbiIsICJmY3NfdmVnIiwgImZjc19mcnVpdCIsICJmY3NfZmF0IiwgImZjc19zdWdhciIsDQogICAgICAgICAgICAiY3NfY3Jpc2lzX3NvbGRfcHJvZF9hc3NldHMiLCAiY3NfY3Jpc2lzX25vX3NjaG9vbCIsIA0KICAgICAgICAgICAgImNzX2NyaXNpc19yZWR1Y2VkX2hlYWx0aF9leHAiLCAiY3NfZW1lcmdlbmN5X3NvbGRfaG91c2UiLCANCiAgICAgICAgICAgICJjc19lbWVyZ2VuY3lfaGhfbWlncmF0aW9uIiwgImNzX2VtZXJnZW5jeV9oaF9yaXNrIiwgDQogICAgICAgICAgICAiZmllc19mZXdmb29kIiwgImZpZXNfc2tpcHBlZCIsICJmaWVzX3dobGRheSIsICJmaWVzX2h1bmdyeSIsICJmaWVzX2F0ZWxlc3MiLCANCiAgICAgICAgICAgICJmaWVzX2hlYWx0aHkiLCAiZmllc19ydW5vdXQiLCAiZmllc193b3JyaWVkIiksIA0KICAgICAgICAgIG91dHB1dCA9ICJhbGwiLCBtZXRob2QgPSAiY3oiKQ0KDQpgYGANCg0KPGJyPjxicj4NCg0KIyMjIDQuMyBMaW1pdGVkIHBlcmZvcm1hbmNlIG9mIGxpbmVhciByZWdyZXNzaW9uIG1vZGVscw0KDQpQcmlvciB0byB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIGRlY2lzaW9uIHRyZWUgZGV0YWlsZWQgaW4gc2VjdGlvbiAxLjMsIGEgbGluZWFyIHJlZ3Jlc3Npb24gbW9kZWwgaGFkIGJlZW4gY29uc2lkZXJlZC4gSG93ZXZlciwgbm8gbWF0dGVyIGhvdyBzb3BoaXN0aWNhdGVkIHRoZSBtZXRob2QsIHRoZSBoaWdoZXN0IHItc3F1YXJlZCBhY2hpZXZlZCB3YXMgMC4xMzYgKGEgbW9kZWwgd2l0aCBhbiByLXNxdWFyZWQgd2l0aCAxIHdvdWxkIG1lYW4gaXQgd2FzIHBlcmZlY3RseSBwcmVkaWN0aXZlIGFuZCBhbiByLXNxdWFyZWQgb2YgMCBtZWFucyB0aGF0IGEgbW9kZWwgZG9lcyBub3QgcHJlZGljdCBhbnkgb2YgdGhlIHZhcmlhbmNlIGF0IGFsbDsgaW4gdGhpcyBjYXNlLCB0aGUgYmVzdCBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBzdGlsbCBsZWZ0IDg2JSBvZiB0aGUgdmFyaWFuY2UgdW5leHBsYWluZWQpLiANCg0KV2l0aCByZWZlcmVuY2UgdG8gdGhlIHBsb3QgYmVsb3cgb2YgcHJlZGljdGVkIHZhbHVlcyBvZiB0aGUgZm9vZCBzZWN1cml0eSBzY29yZSB2cyB0aGUgYWN0dWFsIHZhbHVlcyAob2YgdGhlIGJlc3QgcGVyZm9ybWluZyBtb2RlbCksIHdoaWxzdCB0aGVyZSBpcyBhIHNpZ25pZmljYW50IHJlbGF0aW9uc2hpcCwgaXRzIHByZWRpY3RpdmUgcGVyZm9ybWFuY2UgaXMgdG9vIHdlYWsuIFRoaXMgd2FzIHdoeSBhIGRlY2lzaW9uIHRyZWUgd2FzIGVtcGxveWVkIGluc3RlYWQgb2YgYSBsaW5lYXIgbW9kZWwuIEVhY2ggcG9pbnQgaW4gdGhlIHBsb3QgYmVsb3cgaXMgYSBob3VzZWhvbGQgaW4gdGhlIHN1cnZleS4gDQoNCjxicj4NCg0KYGBge3J9DQpvbHMgPC0gc3VydmV5ICU+JSBzZWxlY3QoZnNfc2NvcmUyLCBob2hfZmVtYWxlLCBydXJhbCwgbm90X2ltcHJvdmVkX3Nhbml0YXRpb24sIA0KICAgICAgICAgY29udGFpbnMoImVkdV8iKSwgY29udGFpbnMoInNob2Nrc18iKSwgY29udGFpbnMoImluY29tZV9tcyIpLCBzdXJ2ZXlfaWQpICU+JSANCiAgbGVmdF9qb2luKHN1cnZleSAlPiUgc2VsZWN0KHN1cnZleV9pZCwgaG9oX2FnZSkgJT4lDQogICAgICAgICAgICAgIG11dGF0ZSh2YWx1ZSA9IDEpICU+JQ0KICAgICAgICAgICAgICBwaXZvdF93aWRlcihuYW1lc19mcm9tID0gaG9oX2FnZSwgdmFsdWVzX2Zyb20gPSB2YWx1ZSwgdmFsdWVzX2ZpbGwgPSAwKSAlPiUNCiAgICAgICAgICAgICAgc2VsZWN0KC1gTkFgKSwgYnkgPSAic3VydmV5X2lkIikgJT4lIA0KICBzZWxlY3QoLXN1cnZleV9pZCkgJT4lDQogICNzbGljZSgtYyggNjksIDI5NywgIDY2MCwgMTE4NiwgMTIyMiwgMTI1NiwgMTM1NCwgMTM2MiwgMTcyMCwgDQogICMgICAgICAgICAgMTgyMCwgMTgyMywgMTg0MywgMTkzNiwgMTk1MCwgMTk1MiwgMjAwMywgMjEzMiwgMjMyOSwgMjU5NCkpICU+JSANCiAgZHJvcF9uYSgpICU+JSANCiAgbXV0YXRlKGZzX3Njb3JlMiA9IGxvZyhmc19zY29yZTIpLCANCiAgICAgICAgIGZzX3Njb3JlMiA9IGlmZWxzZShpcy5pbmZpbml0ZShmc19zY29yZTIpLCAwLCBmc19zY29yZTIpKSAlPiUgDQogIGxtKGZzX3Njb3JlMiB+IC4sIGRhdGEgPSAuKSANCg0Kc3VydmV5ICU+JSANCiAgbXV0YXRlKGZzX3Njb3JlMiA9IGxvZyhmc19zY29yZTIpLCANCiAgICAgICAgIGZzX3Njb3JlMiA9IGlmZWxzZShpcy5pbmZpbml0ZShmc19zY29yZTIpLCAwLCBmc19zY29yZTIpKSAlPiUgDQogIGdncGxvdChhZXMoeCA9IHByZWRpY3Qob2xzKSwgeSA9IGZzX3Njb3JlMikpICsgDQogIGdlb21fcG9pbnQoKSArIA0KICBnZW9tX2FibGluZShpbnRlcmNlcHQgPSAwLCBzbG9wZSA9IDEsIGx0eSA9IDIsIGNvbG91ciA9ICJyZWQiKSArIA0KICBsYWJzKHggPSAiTG9nIG9mIHByZWRpY3RlZCB2YWx1ZXMiLCB5ID0gIkxvZyBvZiBhY3R1YWwgdmFsdWVzIiwgDQogICAgICAgdGl0bGUgPSAiUHJlZGljdGVkIHZzIGFjdHVhbCB2YWx1ZXMgZm9yIGZvb2Qgc2VjdXJpdHkgc2NvcmUiKSANCg0KYGBgDQoNCjxicj4NCg0KVGhlIHJlbGF0aXZlbHkgbG93IHItc3F1YXJlZCBpcyBsaWtlbHkgZHVlIHRvIG1pc3NpbmcgdmFyaWFibGVzIGluIHRoZSBGQU8tV0ZQIHN1cnZleS4gRm9yIGluc3RhbmNlLCB0aGUgZmFjdG9ycyB0aGF0IGdvIGludG8gYSBob3VzZWhvbGQncyBkZWNpc2lvbiB0byByZWR1Y2UgdGhlaXIgaGVhbHRoY2FyZSBleHBlbmRpdHVyZXMgYXJlIHRvbyBtdWx0aWZhcmlvdXMgdG8gYmUgY2FwdHVyZWQgYnkgYSBzdXJ2ZXkgb24gZm9vZCBzZWN1cml0eS4gDQoNClRoaXMgcGF0dGVybiB3YXMgYWxzbyB0cnVlIGZvciB0aGUgb3ZlcmFsbCBmb29kIHNlY3VyaXR5IHNjb3JlIGFzIHdlbGwgYXMgdGhlIGluZGl2aWR1YWwgZm9vZCBzZWN1cml0eSBpbmRpY2VzIChGb29kIENvbnN1bXB0aW9uIFNjb3JlLCBGb29kIEluc2VjdXJpdHkgRXhwZXJpZW5jZSBTY2FsZSBhbmQgQ29waW5nIFN0cmF0ZWdpZXMgSW5kZXgpLg0KDQpGb3IgYWRkaXRpb25hbCByZWZlcmVuY2UsIHRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgdG9wIDE1IHZhcmlhYmxlcyByYW5rZWQgYnkgdGhlIHBlcmNlbnRhZ2Ugb2YgdmFyaWFuY2Ugb2YgdGhlIGZvb2Qgc2VjdXJpdHkgc2NvcmUgdGhhdCB0aGV5IGV4cGxhaW4uIA0KDQoNCmBgYHtyIHRhYmxlLXBjLXZhcmlhbmNlfQ0Kb2xzICU+JSANCiAgYW5vdmEoKSAlPiUgDQogIHRpZHkoKSAlPiUgDQogIG11dGF0ZShwY192YXJpYW5jZSA9IHN1bXNxIC8gc3VtKHN1bXNxKSkgJT4lIA0KICBhcnJhbmdlKGRlc2MocGNfdmFyaWFuY2UpKSAlPiUgDQogIHNlbGVjdCh0ZXJtLCBwY192YXJpYW5jZSkgJT4lIA0KICBtdXRhdGUocGNfdmFyaWFuY2UgPSByb3VuZChwY192YXJpYW5jZSAqIDEwMCwgZGlnaXRzID0gMikpICU+JSANCiAgaGVhZCgxNSkgJT4lIA0KICBrYWJsZShjYXB0aW9uID0gIlZhcmlhYmxlcyByYW5rZWQgYnkgcGVyY2VudCBvZiB2YXJpYW5jZSIpICU+JSANCiAga2FibGVfY2xhc3NpY18yKCJzdHJpcGVkIiwgZnVsbF93aWR0aCA9IEZBTFNFLCBwb3NpdGlvbiA9ICJsZWZ0IikNCg0KYGBgDQoNCjxicj48YnI+DQoNCiMjIyA0LjQgUGFpcndpc2UgY29ycmVsYXRpb25zIG9mIGluZGljYXRvcnMgaW4gdGhlIEZBTy1XRlAgc3VydmV5DQoNClRoZSB0YWJsZSBiZWxvdyBzaG93cyB0aGUgdG9wIDIwIGNvcnJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBkaWZmZXJlbnQgdmFyaWFibGVzIGNvbGxlY3RlZCBieSB0aGUgRkFPLVdGUCBmb29kIHNlY3VyaXR5IHN1cnZleS4gV2hlbiBhIHBhcnRpY3VsYXIgdmFyaWFibGUgaXMgb2YgaW50ZXJlc3QsIGl0IG1heSBiZSB1c2VmdWwgYW5kIGludGVyZXN0aW5nIHRvIHNlZSB3aGljaCBvdGhlciB2YXJpYWJsZXMgaXQgaXMgbW9zdCBjb3JyZWxhdGVkIHdpdGguIA0KDQpUaGUgdmFzdCBtYWpvcml0eSBvZiB0aGUgdmFyaWFibGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgY29tcG9zaXRlIHNjb3JlcyBhbmQgaW5kaWNlcywgYXJlIGJpbmFyeSwgd2l0aCAxIGJlaW5nIHRydWUgYW5kIDAgYmVpbmcgZmFsc2UuIEluIHRoZXNlIGNhc2VzLCBhIGNvcnJlbGF0aW9uIG9mIDEgd291bGQgbWVhbiB0aGF0IGEgdmFyaWFibGUgaXMgdHJ1ZSBmb3IgYWxsIHRoZSBob3VzZWhvbGRzIGluIHdoaWNoIGl0cyBtYXRjaCBpcyBhbHNvIHRydWU7IGEgY29ycmVsYXRpb24gb2YgMC41IG1lYW5zIHRoYXQgYSB2YXJpYWJsZSBpcyB0cnVlIGZvciA1MCUgb2YgdGhlIGhvdXNlaG9sZHMgaW4gd2hpY2ggaXRzIG1hdGNoIGlzIHRydWUuIA0KDQpGb3IgaW5zdGFuY2UsIHdoZXRoZXIgb3Igbm90IHRoZSBoZWFkIG9mIHRoZSBob3VzZWhvbGQgaGFzIGNvbXBldGVkIGVkdWNhdGlvbiAoKmVkdV9oaWdoZXIqKSBpcyBtb3N0IGNvcnJlbGF0ZWQgd2l0aCBob3VzZWhvbGRzIHdob3NlIG1haW4gaW5jb21lIHNvdXJjZSBpcyBzdGFibGUgbm9uLWFncmljdWx0dXJhbCBpbmNvbWUgKCppbmNvbWVfbXNfc3RhYmxlX25vbl9hZyopLiBTaW1pbGFybHksIGEgY29ycmVsYXRpb24gb2YgMC4xNzUgYmV0d2VlbiAqcnVyYWwqIGFuZCAqZWR1X25vbmUqIGluZGljYXRlcyB0aGF0IGluIDE3LjUlIG9mIGFsbCBydXJhbCBob3VzZWhvbGRzLCB0aGUgaGVhZCBvZiBob3VzZWhvbGQgaGFzIG5vIGZvcm1hbCBlZHVjYXRpb25hbCBhdHRhaW5tZW50LiBJdCBhbHNvIHNob3VsZCBiZSBub3RlZCB0aGF0IHRoZSBjb21wb25lbnRzIG9mIGVhY2ggb2YgdGhlIGZvb2Qgc2VjdXJpdHkgaW5kaWNlcyBhcmUgbW9zdCBjb3JyZWxhdGVkIHdpdGggZWFjaCBvdGhlci4gDQoNCjxicj4NCg0KYGBge3J9DQpzdXJ2ZXlfbG9uZyAlPiUNCiAgZ3JvdXBfYnkodmFyKSAlPiUgDQogIG11dGF0ZShjb3VudCA9IGlmZWxzZSh2YWx1ZSA+IDAsIDEsIDApLA0KICAgICAgICAgY291bnQgPSBzdW0oY291bnQpKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIGZpbHRlcihjb3VudCA+IDUwKSAlPiUgIyBhZGp1c3QgdGhlIHRocmVzaG9sZCBuDQogIHBhaXJ3aXNlX2Nvcih2YXIsIHN1cnZleV9pZCwgdmFsdWUgPSB2YWx1ZSwgc29ydCA9IFRSVUUpICU+JSANCiAgcmVuYW1lKHZhcmlhYmxlID0gaXRlbTEsIG1hdGNoID0gaXRlbTIpICU+JSANCiAgZ3JvdXBfYnkodmFyaWFibGUpICU+JSANCiAgdG9wX24oYWJzKGNvcnJlbGF0aW9uKSwgbiA9IDIwKSAlPiUgDQogIGRhdGF0YWJsZShmaWx0ZXIgPSBsaXN0KHBvc2l0aW9uID0gInRvcCIsIGNsZWFyID0gRkFMU0UpLA0KICAgICAgICAgICAgb3B0aW9ucyA9IGxpc3QocGFnZUxlbmd0aCA9IDEwLCBzY3JvbGxYID0gVFJVRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaCA9IGxpc3QocmVnZXggPSBUUlVFKSkpICU+JSANCiAgZm9ybWF0Um91bmQoYygiY29ycmVsYXRpb24iKSwgZGlnaXRzID0gMykNCmBgYA0KDQo8YnI+PGJyPg0KDQojIyMgNC41IENhbGN1bGF0aW5nIHRoZSBjb25mbGljdCBzY29yZQ0KDQpUaGUgY29uZmxpY3Qgc2NvcmUgaGVyZSBvcmlnaW5hbGx5IGFwcGVhcmVkIGluIHRoZSBGb29kIFNlY3VyaXR5IENsdXN0ZXIncyByZXBvcnQgW1VuZGVyc3RhbmRpbmcgQ29uZmxpY3QgRHluYW1pY3MgaW4gTXlhbm1hciB0aHJvdWdoIENvbmZsaWN0IGFuZCBJbmNpZGVudCBEYXRhOiBBIEZvb2QgU2VjdXJpdHkgUGVyc3BlY3RpdmVdKGh0dHBzOi8vZm9vZC1zZWN1cml0eS1jbHVzdGVyLW15YW5tYXIuZ2l0aHViLmlvL2V4cGxvcmF0b3J5LWRhdGEtYW5hbHlzaXMtYWNsZWQtZnNjLykuIEl0IHdhcyBjYWxjdWxhdGVkIHVzaW5nIEFDTEVEIGRhdGEgYW5kIHlpZWxkcyBhIHNjb3JlIGZvciBlYWNoIHRvd25zaGlwLiANCg0KVGhlIGNvbmZsaWN0IHNjb3JlIGlzIGFuIHVwZGF0ZSBvZiB0aGUgY29uZmxpY3QgaW5kZXggaW4gdGhlIFtNSU1VLUhBUlAgVnVsbmVyYWJpbGl0eSBBbmFseXNpc10oaHR0cDovL3RoZW1pbXUuaW5mby92dWxuZXJhYmlsaXR5LWluLW15YW5tYXIpLCB1c2luZyAyMDIxIGRhdGEuIFRoZSBzcGVjaWZpYyBjb25mbGljdCB2YXJpYWJsZXMgdGhhdCBpbmNsdWRlZCBpbiB0aGUgc2NvcmUgd2VyZSBiYXR0bGVzLCBleHBsb3Npb25zIGFuZCByZW1vdGUgdmlvbGVuY2UsIG5vbi1wZWFjZWZ1bCBwcm90ZXN0cyBhbmQgcmlvdHMsIGNvbmZsaWN0LXJlbGF0ZWQgZmF0YWxpdGllcywgc3RyYXRlZ2ljIGRldmVsb3BtZW50cyBhbmQgbnVtYmVyIG9mIElEUHMuIA0KDQpUaGUgY29uZmxpY3Qgc2NvcmUgaXMgYW4gYXZlcmFnZSBvZiB0aGUgbm9ybWFsaXNlZCB2YWx1ZXMgb2Yga2V5IGNvbmZsaWN0IGluZGljYXRvcnMuIEl0cyBtYWluIHVzZSBpdCB0byBhaWQgZGVjaXNpb25zIGFib3V0IGdlb2dyYXBoaWMgcHJpb3JpdGlzYXRpb24uIFRoZXNlIG5vcm1hbGlzZWQgdmFsdWVzIGhhdmUgYmVlbiByZS13ZWlnaHRlZCB3aXRoIEJldHRpLVZlcm1hIG1ldGhvZCwgd2hpY2ggcGVuYWxpc2VzIHJlZHVuZGFuY3kgYW5kIHJld2FyZHMgdmFyaWF0aW9uOyB0aGlzIGlzIHRoZSBvbmx5IG5vdGFibGUgZGl2ZXJnZW5jZSBmcm9tIHRoZSBNSU1VLUhBUlAgbWV0aG9kb2xvZ3kuIFRoZSBCZXR0aS1WZXJtYSBtZXRob2Qgd2FzIGVtcGxveWVkIHRocm91Z2ggdGhlICoqYG1kZXByaXZgKiogcGFja2FnZSBkZXZlbG9wZWQgYnkgQXR0aWxpbyBhbmQgQWxkbyBCZW5pbmkuIFRoZSBzcGVjaWZpYyBmb3JtdWxhIHVzZWQgaW4gdGhlIGRldmVsb3BtZW50IG9mIHRoZSBzY29yZSBjYW4gZm91bmQgYnkgZG93bmxvYWRpbmcgdGhlIGNvZGUgYXQgdGhlIHRvcC1yaWdodCBjb3JuZXIgb2YgdGhlIHBhZ2UuIA0KDQpIb3dldmVyLCBpdCBtdXN0IGJlIG5vdGVkIHRoYXQgd2hpbHN0IHRoZSBzY29yZXMgdGhlbXNlbHZlcyBjYW4gYmUgc2hhcmVkIGFuZCB1c2VkLCByZXBsaWNhdGluZyBhbGwgdGhlIGNhbGN1bGF0aW9ucyB3aWxsIG5lY2Vzc2l0YXRlIG9idGFpbmluZyBwZXJtaXNzaW9uIGZyb20gVU5IQ1IgYXMgdGhlaXIgdG93bnNoaXAtbGV2ZWwgYnJlYWtkb3duIG9mIElEUCBwb3B1bGF0aW9ucyBoYXZlIG5vdCBiZWVuIHNoYXJlZCBwdWJsaWNseS4gVGhlIEZvb2QgU2VjdXJpdHkgQ2x1c3RlciByZWdyZXRzIHRoaXMgbGltaXRhdGlvbiBhbmQgaXMgYWN0aXZlbHkgYWR2b2NhdGluZyBmb3IgaW5jcmVhc2VkIGRhdGEgdHJhbnNwYXJlbmN5IGFuZCBzaGFyaW5nIGJldHdlZW4gaHVtYW5pdGFyaWFuIGFjdG9ycy4gDQoNCg==